2009-10-21 94 views
2

我想檢查(通過VBScript)腳本運行的上下文是否允許我執行管理任務。VBScript:檢查腳本是否具有管理權限

要求:

  • 該解決方案應該在所有的Windows操作系統上運行先從服務器2003(這排除了解決方案,只是檢查爲Administrators組中的成員 - 記得有UAC在Vista和Windows 7!)
  • 解決方案應該是簡單。一個50 LOC解決方案,用於檢查Windows組成員資格(當然,因爲用戶可能是屬於Administrators組成員的組的成員),然後對Vista進行一些額外檢查UAC是不是簡單的
  • 解決方案可能有點骯髒,所以沿着this solution行的東西就可以。
  • 它不應該太髒。將文件寫入C:\ Windows或編寫註冊表項在我看來太髒了,因爲它修改了系統。 (編輯:這可能不反正工作:例如,在一個HTA使用VBScript時,UAC重定向踢)

相關問題:https://stackoverflow.com/questions/301860(所有我在那裏發現了答案(一)忽略UAC問題和(b)是錯誤的,因爲他們忽略用戶具有管理權限的可能性,儘管不是管理員組中的直接成員)

回答

1

可能將此(WhoAmI from VBscript)與此(UAC Turned On)組合。

下面是代碼,不幸的預-REQ XP的是「whoami.exe」,在資源工具包或者支持工具發現XP(Wikipedia) - 我還是想找到一種方法離不開它。

If UserPerms("Admin") Then 
Message = "Good to go" 
Else 
Message = "Non-Admin" 
End If 

If UACTurnedOn = true Then 
Message = Message & ", UAC Turned On" 
Else 
Message = Message & ", UAC Turned Off (Or OS < Vista)" 
End If 

Wscript.echo Message 

Function UserPerms (PermissionQuery)   
UserPerms = False ' False unless proven otherwise   
Dim CheckFor, CmdToRun   

Select Case Ucase(PermissionQuery)   
'Setup aliases here   
Case "ELEVATED"   
    CheckFor = "S-1-16-12288"   
Case "ADMIN"   
    CheckFor = "S-1-5-32-544"   
Case "ADMINISTRATOR"   
    CheckFor = "S-1-5-32-544"   
Case Else     
    CheckFor = PermissionQuery     
End Select   

CmdToRun = "%comspec% /c whoami /all | findstr /I /C:""" & CheckFor & """" 

Dim oShell, returnValue   
Set oShell = CreateObject("WScript.Shell") 
returnValue = oShell.Run(CmdToRun, 0, true)  
If returnValue = 0 Then UserPerms = True     
End Function 

Function UACTurnedOn() 
On Error Resume Next 

Set oShell = CreateObject("WScript.Shell") 
If oShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA") = 0 Then 
     UACTurnedOn = false 
Else 
     UACTurnedOn = true 
End If 
End Function 
+0

有趣的方法;你應該添加一個>>如果UserPerms(「Elevated」)Then Message = Message&「,但在」UAC打開「行後面運行提升」<<「。 whoami.exe是一個真正的缺點,尤其是因爲我不確定你是否允許重新分配它(並且你不能指望客戶自己下載這樣的文件)。 – Heinzi 2009-11-06 16:54:11

+0

是的,我喜歡那個補充。除了已經用組(和嵌套)成員資格探索過的路線外,我似乎無法從WMI中找到一種方法。仍然可能有一些COM組件允許vbscript快速檢查管理員狀態。 – 2009-11-06 20:00:24

1

以上代碼中需要「whoami」的代碼來自CSI-Windows.com/toolkit/ifuserperms上的IfUserPerms腳本。 (9行)和CMD/BAT(3行)中快速,小型,高效,被動(無需更改任何內容)代碼檢查管理員權限的新腳本代碼, 。它也適用於UAC,如果用戶不升級,則報告false。

您可以在這裏找到代碼:http://csi-windows.com/toolkit/csi-isadmin

+1

謝謝,這非常有用。你介意在這裏發佈九行代碼嗎? – Heinzi 2010-01-26 19:56:15

+1

'reg query HKEY_USERS \ S-1-5-20 \ Environment/v TEMP 2> NUL 1>&2 && echo Yes ||回聲否' – RolKau 2012-02-14 22:21:32

1

我已經添加了兩個額外的腳本工具包,極大地提高了原碼以上,從ifuserperms.vbs來了。

CSI_IsSession.vbs可以告訴你幾乎任何你想知道的有關UAC或腳本運行的當前會話的任何信息。

VBScriptUACKit.vbs(它使用CSI_IsSession.vbs)允許您通過重新啓動自身來選擇性地在腳本中提示UAC。已經設計和調試以在許多執行情況下工作。

0

這是導致一個腳本文件或任何其他文件以管理員身份運行的最快方法:

首先創建您的VBS腳本什麼的,你需要做的。 在我的情況下,它是一個註冊表編輯vbs,允許我自動登錄 然後當機器重新啓動時,運行另一個文件以確保 自動登錄未啓用。

創建文件後,您需要創建一個cmd提示符快捷方式。 下一步在快捷方式上右鍵單擊並更改propeties,使其以管理員身份運行。

粘貼這樣你的文件路徑: d:\ WINDOWS \ SYSTEM32 \ CMD.EXE/C 「d:\自卸車\腳本\ StartUp.vbs」

的 'C' 是指完成後,將關閉 如果你想要它保持開放然後使用'K'

希望這可以幫助別人。

1

我知道這個線程是非常古老的,並標記回答,但這是一個簡單的方法,一直爲我工作。用戶S-1-5-19是本地NT權限,因此訪問該密鑰需要管理員權限。它通過海拔運行。

Option Explicit 

msgbox isAdmin(), vbOkonly, "Am I an admin?" 

Private Function IsAdmin() 
    On Error Resume Next 
    CreateObject("WScript.Shell").RegRead("HKEY_USERS\S-1-5-19\Environment\TEMP") 
    if Err.number = 0 Then 
     IsAdmin = True 
    else 
     IsAdmin = False 
    end if 
    Err.Clear 
    On Error goto 0 
End Function 
相關問題