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

时间:2009-02-18 09:25:13

标签: windows ruby command-line privileges

我正在尝试找出如何检测用户是否在Windows XP下以管理员权限运行。由于 whoami 命令,这在Vista / Win7中相当容易。以下是Ruby中的一个片段,介绍如何在Vista下执行此操作:

注意,以下链接现在包含了muteW

建议的解决方案

http://gist.github.com/65931

麻烦的是,whoami不附带Windows XP,因此即使我们以管理员身份运行,上面链接的方法也会在WinXP上返回false。

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

6 个答案:

答案 0 :(得分:32)

这将检测用户是否在提升模式下运行(例如,命令提示符为“运行方式”管理员)。它依赖于您需要管理员权限才能读取LOCAL SERVICE帐户注册码的事实:

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

如果无法读取,则返回非零错误代码,如果可以,则返回零 从XP起作用......

答案 1 :(得分:11)

如果你跑

>net localgroup administrators 

在命令shell中,您应该获取Windows XP中的管理员帐户列表。只需解析并扫描输出以检查所需的特定用户帐户。对于例如检查当前用户是否是您可以执行的管理员 -

>net localgroup administrators | find "%USERNAME%"

答案 2 :(得分:7)

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;

答案 3 :(得分:2)

查看CheckTokenMembership方法。有一个IsUserAdmin()实现的示例,以及一些其他有用的社区反馈,关于该函数何时不返回预期的内容以及如何改进它。

答案 4 :(得分:2)

这将在没有炮击的情况下找到:

require 'win32/registry'

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

该策略与Peter的策略相似,但开销较小。

答案 5 :(得分:1)

以下是更好的(PowerShell)方法:https://stackoverflow.com/a/16617861/863980

在一行中,你可以说(复制/粘贴在豪华中它会起作用):

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

=>当用户属于Administrators组(而不是检查用户IS管理员)时返回True

(注意:反引号或严重重音`在PowerShell中转义回车符,在Ruby中它执行shell命令,比如C ++的系统(&#39;命令&#39;)..)< / p>

所以在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...