2009-10-21 57 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 
相关问题