Melhor maneira de saber se um usuário tem privilégios administrativos de um VBScript

StackOverflow https://stackoverflow.com/questions/301860

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu preciso verificar se o usuário executar o script tem privilégios administrativos na máquina.

Eu ter especificado o usuário executar o script porque o roteiro poderia ter sido executado com um usuário diferente do registrado em usar algo semelhante a "Runas".

@Javier: Ambas as soluções de trabalho em um PC com uma versão em Inglês do Windows instalada, mas não se instalou está em idioma diferente. Isso ocorre porque o grupo de administradores não existe, o nome é diferente, por exemplo, em espanhol. Eu preciso a solução para o trabalho em todas as configurações.

Foi útil?

Solução

Você pode usar o script se você quiser ver se o usuário conectado é um administrador

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

Não estou certo como lidar com isso quando o script é executado com "Runas" eu tenho medo.

Outras dicas

Ao fazer isso você quebrar cenários onde o usuário tem a privs necessários para o seu script, mas não pertence a administradores. Em vez de verificar para adesão ao grupo, para verificar as habilidades específicas que você precisa.

O que sobre a verificação de "\\ 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

Ive tentou solução de Tim C em uma caixa de Windows 7 no meu rede da empresa onde eu realmente tem direitos de administrador. Mas ele mostra o meu usuário como não ter direitos de administrador.

Em vez disso, usou um método hackier, como a chamada "desfragmentação" no prompt de cmd requer acesso de administrador. Enquanto ele funciona, se desconfiar que XP e 7 (e possivelmente versões futuras do Windows) diferem no código de retorno. Pode haver escolhas mais consistentes do que defrag, mas funciona para agora.

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

Eu sei que esta discussão é muito antiga e marcada respondidas, mas a resposta não está realmente dando o que o OP perguntado sobre.

Para qualquer outra pessoa procurar e encontrar esta página, aqui está uma alternativa que faz relatório com base em direitos não membros do grupo para espectáculos Runas administrador direitos de administrador como 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

Este artigo tem um bom pedaço de código sobre como enumerar os membros de um grupo (copiado aqui por conveniência e editado para não usar o endereço de email):

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

Você pode então escrever uma função para ver se um usuário está na lista ...

Function IsAdmin(user)
    IsAdmin = InStr(RetrieveUsers("MachineName", "Administrators"), user) > 0
End Function

... e chamá-lo assim:

If IsAdmin("LocalAccount") Then
    Wscript.Echo "LocalAccount is an admin"
Else
    Wscript.Echo "LocalAccount is not an admin"
End If
outro método n sujo rápida

Ainda. Retorna <> 0 Se IsNotAdmin

Function IsNotAdmin()
    With CreateObject("Wscript.Shell")
        IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
    End With
End Function

O usuário pode não ser no grupo de administradores local. Por exemplo - Administradores de Domínio. UAC geralmente bloqueia acesso de administrador para o registro, as ações e.t.c. mesmo para administradores (onl y "Executar como administrador" Manual fica à direita) ...

Aqui é a minha maneira louca:

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
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

Usando o "localhost" em vez do nome de máquina real aumenta o tempo de execução de script cerca de 10x
Meu código final é:

' 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)

Este código de script retorna saída 0 se o usuário atual é um administrador local.
Uso: get_admin_status.vbs cscript.exe

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top