أفضل طريقة لمعرفة ما إذا كان المستخدم لديه امتيازات إدارية من فبسكريبت

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

  •  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
<ع> استخدام "مضيف" بدلا من اسم المضيف الحقيقي يزيد من وقت التشغيل النصي حول 10X
قانون بلدي النهائي هو:

' 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top