13

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

请注意,以下链接现在包含 muteW 建议的解决方案

http://gist.github.com/65931

问题是,whoami 没有随 Windows XP 一起提供,所以上面链接的方法在 WinXP 上总是会返回 false,即使我们以管理员身份运行。

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

4

6 回答 6

32

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

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

如果无法读取,这将返回非零错误代码,如果可以读取,则返回零。
从 XP 开始工作...

于 2011-07-14T10:21:30.857 回答
11

如果你跑

>net localgroup administrators 

在命令外壳中,您应该获得 Windows XP 中的管理员帐户列表。只需解析和扫描输出以检查您想要的特定用户帐户。例如,要检查当前用户是否是管理员,您可以这样做 -

>net localgroup administrators | find "%USERNAME%"
于 2009-02-18T09:46:24.560 回答
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;
于 2009-02-18T13:13:22.690 回答
2

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

于 2009-02-18T09:32:58.400 回答
2

这将在没有炮击的情况下发现:

require 'win32/registry'

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

该策略类似于 Peter 的策略,但开销较小。

于 2014-02-05T19:43:27.817 回答
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++ 的 system('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...
于 2014-10-11T19:44:48.760 回答