运行提升模式下的ruby脚本

我需要在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 在这里的答案