2009-02-18 71 views
13

我想解决如何检测用户是否在Windows XP下使用管理员权限运行。这在Vista/Win7中很容易实现,这要归功于whoami命令。下面是如何做到这一点Vista下在Ruby中的一个片段:检测如果在Windows XP下使用管理员权限运行

注意,下面的链接现在合并由muteW

http://gist.github.com/65931

麻烦的是,WHOAMI不来与建议的解决方案Windows XP和上面的链接方法总是会在WinXP上返回false,即使我们是以管理员身份运行。

那么,有没有人知道一种方法来检测我们是否在Windows XP下使用Ruby,命令行工具,批处理文件甚至第三方作为管理员运行(需要开源,真的)工具?

回答

32

此代码将检测用户是否在提升模式下运行(例如,“Run As”管理员的命令提示符)。它依赖于您需要管理员权限读取本地服务帐户REG关键的事实:

reg query "HKU\S-1-5-19" 

这将返回一个非零的错误代码,如果它不能被读取,并且零,如果它可以。从XP了
作品...

2

检查出CheckTokenMembership方法。在那里有一个IsUserAdmin()实例的示例,以及一些其他有用的社区反馈,说明该函数何时不会返回预期的结果以及如何改进它。

11

如果在命令shell中运行

>net localgroup administrators 

你应该得到管理员的帐户列表在Windows XP中。只需解析并扫描输出以检查您想要的特定用户帐户。对于例如检查当前用户是你可以做一个系统管理员 -

>net localgroup administrators | find "%USERNAME%" 
+2

这只验证用户名是否在Admin组中 - 它不检测当前会话是否具有管理权限。例如,在使用UAC的Win 7上,默认情况下,命令提示符以非管理员身份运行,并且上述命令将错误地将会话报告为Admin。请参阅我的解决方案,以获得更可靠的东西 – 2011-07-14 10:25:00

7

Piskvor选项的罚款,或查看URL 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; 
+0

它使用WINDOWS API在C中制作,所以您不需要其他任何东西来运行此操作,只需编译它 – gonxalo 2009-02-18 13:20:39

+0

请注意,如果从管理员帐户中运行的Vista程序调用,这将返回FALSE如果该进程没有以'以管理员身份运行'启动。 – 2009-03-30 17:02:29

2

这将找出不脱壳而出:

require 'win32/registry' 

is_admin = false 
begin 
    Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| } 
    is_admin = true 
rescue 
end 

的策略是类似彼得的,但开销更少。

1

这里是做的更好(PowerShell的)方式:https://stackoverflow.com/a/16617861/863980

在一条线,你可以说(在高级复制/粘贴,它会工作):

(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | ` 
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator" 

=>收益True当用户属于管理员组时(与检查用户IS管理员相反)

(注意:反向或重音重音在PowerShell中转义回车,在Ruby中执行shell命令,如C++的系统('命令“)..)

所以在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... 
相关问题