检测是否在Windows XP下以pipe理员权限运行

我想解决如何检测用户是否在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...