我需要检查执行脚本的用户是否具有该计算机的管理权限。
我已指定执行脚本的用户,因为脚本可能是使用与“Runas”类似的内容以外的用户执行的。
@Javier:这两种解决方案都适用于安装了英文版Windows的PC,但如果安装的语言不同,则不行。这是因为Administrators组不存在,名称不同,例如西班牙语。我需要解决方案才能在所有配置中工作。
答案 0 :(得分:4)
通过执行此操作,您可以破坏用户具有脚本所需权限但不属于管理员的方案。而不是检查组成员身份,检查您需要的具体能力。
答案 1 :(得分:3)
检查“\\ computername \ Admin $ \ system32”怎么样?
function IsLoggedInAsAdmin()
isAdmin = false
set shell = CreateObject("WScript.Shell")
computername = WshShell.ExpandEnvironmentStrings("%computername%")
strAdmin = "\\" & computername & "\Admin$\System32"
isAdmin = false
set fso = CreateObject("Scripting.FileSystemObject")
if fso.FolderExists(strAdmin) then
isAdmin = true
end if
IsLoggedInAsAdmin = isAdmin
end function
答案 2 :(得分:2)
如果要查看登录用户是否为管理员,可以使用脚本
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strUser = objNetwork.UserName
isAdministrator = false
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser in objGroup.Members
If objUser.Name = strUser Then
isAdministrator = true
End If
Next
If isAdministrator Then
Wscript.Echo strUser & " is a local administrator."
Else
Wscript.Echo strUser & " is not a local administrator."
End If
我不知道当脚本与“Runas”一起运行时如何处理它我很害怕。
答案 3 :(得分:2)
我在公司网络上的Windows 7机箱上尝试过Tim C的解决方案,我确实拥有管理员权限。但它显示我的用户没有管理员权限。
相反,我使用了一种hackier方法,因为在cmd提示符中调用“defrag”需要管理员访问权限。虽然它有效,但要小心XP和7(以及可能的未来版本的Windows)的返回代码不同。可能存在比碎片整理更一致的选择,但它现在有效。
Function isAdmin
Dim shell
set shell = CreateObject("WScript.Shell")
isAdmin = false
errlvl = shell.Run("%comspec% /c defrag /?>nul 2>nul", 0, True)
if errlvl = 0 OR errlvl = 2 Then '0 on Win 7, 2 on XP
isAdmin = true
End If
End Function
答案 4 :(得分:2)
我知道这个帖子已经很老了并且标记了答案,但答案并没有真正给出了OP所询问的内容。
对于搜索和查找此页面的任何其他人,此处是基于权限而不是组成员身份进行报告的替代方案,因此Runas Administrator将管理员权限显示为True。
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
答案 5 :(得分:1)
This article有很多关于如何枚举组成员的代码(为方便起见而复制到这里并编辑为不使用电子邮件地址):
Function RetrieveUsers(domainName,grpName)
dim GrpObj
dim mbrlist
dim mbr
'-------------------------------------------------------------------------------
' *** Enumerate Group Members ***
'-------------------------------------------------------------------------------
' Build the ADSI query and retrieve the group object
Set GrpObj = GetObject("WinNT://" & domainName & "/" & grpName & ",group")
' Loop through the group membership and build a string containing the names
for each mbr in GrpObj.Members
mbrlist = mbrlist & vbTab & mbr.name & vbCrLf
Next
RetrieveUsers=mbrlist
End Function
然后,您可以编写一个函数来查看用户是否在列表中......
Function IsAdmin(user)
IsAdmin = InStr(RetrieveUsers("MachineName", "Administrators"), user) > 0
End Function
......并且这样称呼它:
If IsAdmin("LocalAccount") Then
Wscript.Echo "LocalAccount is an admin"
Else
Wscript.Echo "LocalAccount is not an admin"
End If
答案 6 :(得分:1)
另一种快速的脏方法。返回<> 0如果是IsNotAdmin
Function IsNotAdmin()
With CreateObject("Wscript.Shell")
IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
End With
End Function
答案 7 :(得分:1)
用户可能不在本地管理员组中。例如-域管理员。 UAC通常会阻止管理员访问注册表,共享e.t.c.甚至对于管理员(只有以“以管理员身份运行”的手册才正确)...
这是我疯狂的方式:
Set Shell = CreateObject("WScript.Shell")
set fso = CreateObject("Scripting.FileSystemObject")
strCheckFolder = Shell.ExpandEnvironmentStrings("%USERPROFILE%")
strCheckFolder = strCheckFolder+"\TempFolder"
if fso.FolderExists(strCheckFolder) then
fso.DeleteFolder(strCheckFolder)
end if
fso.CreateFolder(strCheckFolder)
tempstr = "cmd.exe /u /c chcp 65001 | whoami /all >" & strCheckFolder & "\rights.txt"
Shell.run tempstr
tempstr = strCheckFolder & "\rights.txt"
WScript.Sleep 200
Set txtFile = FSO.OpenTextFile(tempstr,1)
IsAdmin = False
Do While Not txtFile.AtEndOfStream
x=txtFile.Readline
If InStr(x, "S-1-5-32-544") Then
IsAdmin = True
End If
Loop
txtFile.Close
答案 8 :(得分:0)
Function isAdmin
Dim shell
Set shell = CreateObject("WScript.Shell")
isAdmin = false
errorLevel = shell.Run("%comspec% /c net session >nul 2>&1", 0, True)
if errorLevel = 0
isAdmin = true
End If
End Function
答案 9 :(得分:0)
使用“localhost”而不是真正的主机名将脚本运行时间增加大约10倍!
我的最终代码是:
' get_admin_status.vbs
Option Explicit
Dim oGroup: Set oGroup = GetObject("WinNT://localhost/Administrators,group")
Dim oNetwork: Set oNetwork = CreateObject("Wscript.Network")
Dim sSearchPattern: sSearchPattern = "WinNT://" & oNetwork.UserDomain & "/" & oNetwork.UserName
Dim sMember
For Each sMember In oGroup.Members
If sMember.adsPath = sSearchPattern Then
' Found...
Call WScript.Quit(0)
End If
Next
' Not found...
Call WScript.Quit(1)
如果当前用户是本地管理员,则此脚本返回退出代码0 用法:cscript.exe get_admin_status.vbs