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

检测是否在Windows XP下以管理员权限运行,windows,ruby,command-line,privileges,Windows,Ruby,Command Line,Privileges,我正在尝试找出如何检测用户是否在Windows XP下以管理员权限运行。由于使用了whoami命令,这在Vista/Win7中相当容易做到。下面是Ruby中的一个片段,介绍如何在Vista下执行此操作: 注意,下面的链接现在包含了muteW建议的解决方案 问题是,whoami不随Windows XP提供,因此在WinXP上,即使我们以管理员身份运行,上述链接方法也将始终返回false 那么,有人知道一种方法来检测我们是否在Windows XP下以管理员身份运行,使用Ruby、命令行工具、批处理

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

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

问题是,whoami不随Windows XP提供,因此在WinXP上,即使我们以管理员身份运行,上述链接方法也将始终返回false

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

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

如果您运行

>net localgroup administrators 
在命令shell中,您应该获得Windows XP中的管理员帐户列表。只需解析并扫描输出,检查您想要的特定用户帐户。例如,要检查当前用户是否为管理员,您可以执行以下操作-

>net localgroup administrators | find "%USERNAME%"

Piskvor选项很好,或者检查此url

这是该页面中的代码

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;

这将检测用户是否在提升模式下运行(例如“以管理员身份运行”的命令提示符)。这取决于您需要管理员权限才能读取本地服务帐户注册表项:

reg query "HKU\S-1-5-19"
如果无法读取,则返回非零错误代码;如果可以,则返回零错误代码。

从XP开始工作…

这将在不进行炮击的情况下发现:

require 'win32/registry'

is_admin = false
begin
  Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
  is_admin = true
rescue
end
该策略与Peter的类似,但开销较小。

以下是更好的(PowerShell)方法:

在一行中,您可以这样说(复制/粘贴在posh中,它将起作用):

=>当用户属于管理员组时返回
True
(与检查用户是否为管理员相反)

(注意:backtick或grave-accent`在PowerShell中转义回车,在Ruby中执行shell命令,如C++的system('command')…)

因此,在Ruby中,您可以说(在irb中复制/粘贴):

但我不知道(甚至更好)的方法。有了它,您可以(再次在Ruby中)执行以下操作:


它是使用WINDOWS API在C中制作的,因此您不需要任何其他东西来运行它,只需编译它。请注意,如果进程不是以“以管理员身份运行”启动的,则如果从运行在管理员帐户中的Vista程序调用,则会返回FALSE。这是一个Vista问题。也许你可以在Vista操作系统的同一个程序中添加一个不同的检查…为了将来的参考,上面的代码取自:这只验证用户名是否在管理员组中-它不会检测当前会话是否具有管理员权限。例如,在带有UAC的Win7上,默认情况下,命令提示符以非管理员身份运行,并且上述命令将错误地将会话报告为管理员。请看我的解决方案,如果有人使用C++,系统()返回命令1,如果上面的命令失败,0,如果成功,则返回;这意味着如果用户具有管理员权限,则返回0。回答得很好,彼得。谢谢或者,在C/C++中:调用RegOpenKey(HKEY_用户,“S-1-5-19”和key)并检查是否成功。
(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
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
require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...