사용자가 vbscrip에서 관리 권한이 있는지 확인하는 가장 좋은 방법

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

  •  08-07-2019
  •  | 
  •  

문제

스크립트를 실행하는 사용자가 컴퓨터에 관리 권한이 있는지 확인해야합니다.

"runas"와 유사한 것을 사용하여 로그온 이외의 사용자로 스크립트를 실행할 수 있으므로 스크립트를 실행하는 사용자를 지정했습니다.

@Javier : 두 솔루션 모두 영어 버전의 Windows가 설치된 PC에서 작동하지만 설치된 언어가 다른 언어로 사용되지는 않습니다. 관리자 그룹이 존재하지 않기 때문에 이름은 예를 들어 스페인어로 다릅니다. 모든 구성에서 작동하려면 솔루션이 필요합니다.

도움이 되었습니까?

해결책

로그인 한 사용자가 관리자인지 확인하려면 스크립트를 사용할 수 있습니다.

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"로 실행될 때 어떻게 처리 해야할지 잘 모르겠습니다.

다른 팁

이렇게하면 사용자가 스크립트에 필요한 개인이 있지만 관리자에게 속하지 않은 시나리오를 중단합니다. 그룹 멤버십을 확인하는 대신 필요한 특정 능력을 확인하십시오.

" 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는 실제로 관리 권한이있는 회사 네트워크의 Windows 7 상자에서 Tim C의 솔루션을 시도했습니다. 그러나 내 사용자에게 관리자 권한이없는 것으로 표시됩니다.

대신 CMD 프롬프트에서 "Defrag"를 호출하려면 관리자 액세스가 필요하므로 Hackier 메소드를 사용했습니다. 작동하는 동안 XP와 7 (및 미래 버전의 Windows)이 반환 코드가 다르다고 조심하십시오. DEFRAG보다 일관된 선택이있을 수 있지만 지금은 작동합니다.

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

나는이 스레드가 매우 오래되었고 표시된 대답을 알고 있지만 답은 실제로 OP가 요청한 내용을주는 것이 아닙니다.

이 페이지를 검색하고 찾는 다른 사람에게는 다음은 그룹 멤버십이 아닌 권한을 기반으로보고하는 대안이 있으므로 Runas 관리자는 관리자 권한을 참으로 표시합니다.

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

이 기사 그룹 구성원을 열거하는 방법에 대한 멋진 코드 덩어리가 있습니다 (편의를 위해 여기에 복사하고 이메일 주소를 사용하지 않도록 편집) :

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

또 다른 빠른 N 더러운 방법. ISNOTADMIN이라면 <> 0을 반환합니다

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

사용자는 로컬 관리자 그룹에 있지 않을 수 있습니다. 예를 들어 - 도메인 관리자. UAC는 일반적으로 관리자의 경우에도 레지스트리, 공유 등에 대한 관리자 액세스를 차단합니다 (in y manual "run as admin"이 올바르게됩니다) ...

여기 내 미친 방법이 있습니다.

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

실제 호스트 이름 대신 "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)

이 스크립트는 현재 사용자가 로컬 관리자 인 경우 Exit Code 0을 반환합니다.
사용법 : cscript.exe get_admin_status.vbs

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top