사용자가 vbscrip에서 관리 권한이 있는지 확인하는 가장 좋은 방법
-
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