我需要在Windows下以提升模式(Admin priviledges)运行ruby脚本。 可能吗?
以下是如何做到这一点。 最简单的方法是使用ShellExecute
以elevaded(Admin)权限重新启动可执行文件。
用Ruby你可以这样做:
require 'win32ole' shell = WIN32OLE.new('Shell.Application') shell.ShellExecute('path_to_ruby_program', nil, nil, 'runas')
如果您启用了Windows UAC,则会为您提供熟悉的Windows弹出对话框,请求管理员权限。 一旦你点击是你的进程将与管理员权限运行。
这里的秘密技巧是使用未ShellExecute
操作参数runas
,这将提升请求的操作。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx
还有关于如何手动创建提升的命令提示符快捷方式(在某些情况下可能是一个足够好的解决方案)的相关讨论:
http://www.sevenforums.com/tutorials/3718-elevated-command-prompt-shortcut.html
我想感谢卡斯帕和thegreendroid这个修改后的解决方案。
我不能让自己的例子像现在这样运行,所以通过更多的研究把它放在一起。 我做了一些搜索execute_command
,因为我安装红宝石1.9.3不知道该怎么做,我找不到任何东西,所以我用反引号。 必须逃脱。 2>&1
位是如此ruby实际上得到输出,而不是一个空白字符串,如果该输出匹配正则表达式/ERROR/
然后你没有管理员权限,所以我们希望它返回nil
。
这将重新启动自己的管理权限,然后加载任何你放在require
与评论后。
require 'win32ole' def running_in_admin_mode? (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil? end if running_in_admin_mode? require './main.rb' # load the actual program here. else path = 'rubyw.exe ' + File.expand_path(__FILE__) # optionally 'ruby.exe ' shell = WIN32OLE.new('Shell.Application') shell.ShellExecute(path, nil, nil, 'runas') end
您可以删除def
块并将if
语句更改为
if (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil?
为了简洁起见。 你也可能会失去shell
变量:
WIN32OLE.new('Shell.Application').ShellExecute(path, nil, nil, 'runas')
可能的running_in_admin_mode?
:如果running_in_admin_mode?
可能无限循环running_in_admin_mode?
一再失败,但它对我来说是完美的。
感谢其他作者,我已经开始使用(在Windows 8上测试):
把它添加到ruby脚本的顶部:
def running_in_admin_mode? (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil? end unless running_in_admin_mode? require 'win32ole' shell = WIN32OLE.new('Shell.Application') shell.ShellExecute("ruby", File.expand_path(__FILE__), nil, 'runas') exit end # admin rights ensured do_something()
或者你可以只有一个launcher.cmd包含
cd full\path ruby myscript.rb
并用管理员权限启动这个cmd文件
一旦你用红宝石测试你可以尝试rubyw
另一种方法是确保您不以非管理模式运行您的脚本。 我发现这个解决方案在我的经验中是令人满意的。
可以确定脚本是否以管理员模式运行,
def running_in_admin_mode? query_admin_mode_cmd = 'reg query "HKU\S-1-5-19"' output, exit_status = execute_command(query_admin_mode_cmd) exit_status == 0 end
信贷在彼得McEvoy 在这里的答案