أفضل طريقة لمعرفة ما إذا كان المستخدم لديه امتيازات إدارية من فبسكريبت
-
08-07-2019 - |
سؤال
ولست بحاجة للتحقق ما إذا كان المستخدم تنفيذ البرنامج النصي لديه امتيازات إدارية على الجهاز.
ولقد حددت المستخدم تنفيذ البرنامج النصي لأن السيناريو كان يمكن تنفيذها مع مستخدم آخر من قام بتسجيل الدخول باستخدام شيء يشبه "RUNAS".
وJavier: كل الحلول تعمل في جهاز كمبيوتر مع إصدار اللغة الإنجليزية من Windows تثبيت ولكن ليس إذا المثبتة هي في لغة مختلفة. هذا هو بسبب عدم وجود مجموعة المسؤولين، واسم مختلف على سبيل المثال في الإسبانية. أنا في حاجة إلى حل للعمل في كافة تكوينات.
المحلول
ويمكنك استخدام برنامج نصي إذا كنت ترغب في معرفة ما إذا كان دخوله المستخدم مسؤول
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" أخشى.
نصائح أخرى
وعند القيام بذلك كسر سيناريوهات حيث أن المستخدم لديه privs اللازمة لالسيناريو الخاص بك ولكن لا ينتمي إلى المسؤولين. بدلا من التحقق لعضوية المجموعة، لفحص قدرات محددة تحتاج.
وماذا عن التحقق من وجود "\\ الكمبيوتر \ $ المسؤول \ 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
وإيف حاول حل تيم C على مربع ويندوز 7 على شبكة الشركة التي أعمل بها حيث أنني في الواقع حقوق المشرف. لكنه يظهر المستخدم بصفتي عدم وجود حقوق المسؤول.
وبدلا من ذلك أنا استخدم طريقة hackier، كما دعا "إلغاء التجزئة" في موجه كمد يتطلب الوصول مشرف. في حين أنها تعمل، أن نكون حذرين أن XP و 7 (وربما الإصدارات المستقبلية من ويندوز) تختلف في رمز الإرجاع. قد تكون هناك خيارات أكثر اتساقا من ديفراغ، لكنه يعمل في الوقت الراهن.
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
ولكن طريقة سريعة ن القذرة آخر. عوائد <> 0 إذا IsNotAdmin
Function IsNotAdmin()
With CreateObject("Wscript.Shell")
IsNotAdmin = .Run("%comspec% /c OPENFILES > nul", 0, True)
End With
End Function
قد يكون المستخدم ليس في مجموعة المسؤولين المحليين. على سبيل المثال - مدراء المجال. UAC عادة ما يمنع وصول مشرف إلى التسجيل، e.t.c. سهم حتى بالنسبة للمسؤولين (فقط. t ذ دليل "تشغيل كمسؤول" يحصل على حق) ...
وهنا هو طريقي مجنون:
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
قانون بلدي النهائي هو:
' 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 إذا كان المستخدم الحالي هو المسؤول المحلي.
الاستعمال: get_admin_status.vbs cscript.exe