我想解决如何检测用户是否在Windows XP下使用pipe理员权限运行。 由于whoami命令,这在Vista / Win7中很容易实现。 这里有一个Ruby的代码片段,介绍如何在Vista下做到这一点:
请注意,以下链接现在包含由muteWbuild议的解决scheme
http://gist.github.com/65931
麻烦的是,whoami没有带有Windows XP,所以上面的链接方法总是会在WinXP上返回false,即使我们是以pipe理员身份运行。
那么,有没有人知道一种方法来检测我们是否在Windows XP下使用Ruby,命令行工具,batch file甚至第三方(需要成为开源的工具)作为pipe理员运行?
这将检测用户是否在提升模式下运行(例如,“Run As”Administrator命令提示符)。 它依赖于您需要管理员权限来读取本地服务帐户注册表项的事实:
reg query "HKU\S-1-5-19"
这将返回一个非零的错误代码,如果它不能被读取,如果可以的话,它将返回零。
从XP工作…
如果你跑步
>net localgroup administrators
在命令行中,您应该获得Windows XP中的管理员帐户列表。 只需解析并扫描输出以检查您想要的特定用户帐户。 例如,要检查当前用户是否是管理员,
>net localgroup administrators | find "%USERNAME%"
Piskvor选项它的罚款,或检查此网址http://weseetips.com/2008/04/16/how-to-check-whether-current-user-have-administrator-privilege/
这是该页面中的代码
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; PSID AdministratorsGroup; // Initialize SID. if( !AllocateAndInitializeSid( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup)) { // Initializing SID Failed. return false; } // Check whether the token is present in admin group. BOOL IsInAdminGroup = FALSE; if( !CheckTokenMembership( NULL, AdministratorsGroup, &IsInAdminGroup )) { // Error occurred. IsInAdminGroup = FALSE; } // Free SID and return. FreeSid(AdministratorsGroup); return IsInAdminGroup;
检查CheckTokenMembership方法。 在那里有一个IsUserAdmin()实现的例子,加上一些其他有用的社区反馈,说明函数什么时候没有返回什么是预期的,以及如何改进它。
这将发现没有炮轰:
require 'win32/registry' is_admin = false begin Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| } is_admin = true rescue end
这个策略与Peter的策略类似,但是开销较小。
这是更好的(PowerShell)的方式: https : //stackoverflow.com/a/16617861/863980
在一行中,你可以说(在posh中复制/粘贴,它将工作):
(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | ` foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
当用户属于管理员组时,=>返回True
(而不是检查用户IS管理员)
(注意:反斜杠或重音符号在PowerShell中逃避回车,在Ruby中它执行shell命令,比如C ++的系统('command')..)
所以在Ruby中,你可以说(复制/粘贴irb):
def is_current_user_local_admin? return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True" end
不知道(甚至更好)的WMI的方式做到这一点。 有了这个,你可以做一些像(再次在Ruby中):
require 'win32ole' wmi = WIN32OLE.connect('WinNT://./Administrators,group') # don't know what should come here...