2009-02-18 31 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...