检测是否具有管理员权限在Windows XP下运行
-
05-09-2019 - |
题
我试图找出如何检测用户是否与在Windows XP管理员权限运行。这是很容易在Vista / Win7的感谢做的 WHOAMI 命令。下面是如何做到这一点Vista下在Ruby中的一个片段:
注意,下面的链接现包含由muteW建议的溶液
麻烦的是,WHOAMI不来与Windows XP和因此上述连接方法将总是返回false在WinXP,即使我们以管理员身份运行。
因此,没有人知道的方式来检测是否我们正在为在Windows XP管理员使用Ruby,命令行工具,批量文件,甚至是第三方运行(必须是开源的,真的)工具?
解决方案
如果用户在升高的模式下运行这将检测(例如,这是“运行方式”管理员的命令提示)。它依赖于您需要管理员权限读取本地服务帐户REG关键的事实:
reg query "HKU\S-1-5-19"
这将返回一个非零的错误代码,如果它不能被读取,并且零如果可以。结果 从XP向上工程...
其他提示
如果您运行
>net localgroup administrators
在命令shell中,你应该得到管理员的帐户列表在Windows XP中。简单地分析并扫描输出来检查您需要的用户帐户。对于如检查当前用户是你可以做一个系统管理员 -
>net localgroup administrators | find "%USERNAME%"
Piskvor选项其细,或检查该URL 的http:// weseetips。 COM / 2008/04/16 /如何做检查,无论-当前用户为拥有管理员特权/
这是在该网页的代码
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
在策略类似于彼得的,但具有更少的开销。
下面是这样做的更好(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中回车,在红宝石它执行壳命令,如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...