Способы получения имени пользователя домена из строки SID в VBScript - PullRequest
0 голосов
/ 15 сентября 2011

Недавно я работал над сценарием системного администрирования на чистом VBScript, где требовалось, чтобы он был переносимым без дополнительной установки программного обеспечения.

У меня есть строковая версия SID (например, "S-1-5-21-123456789 ...") и я хочу получить имя пользователя и имя домена.

Попытки сделать это с помощью WMI частично терпят неудачу из-за 10 000 объектов, которые он должен искать на контроллерах домена.

Но, возможно, это можно сделать одним из следующих способов:

  1. через p / invoke из функции LookupAccountSid ADVAPI32.DLL

  2. если , мы можем предположить, что установлен .NETfx 2.0 (чего я действительно предпочел бы избежать, поскольку он не будет полностью переносимым), через System.Security. Принципал (пример на C #: using System.Security.Principal; string account = new SecurityIdentifier(stringSid).Translate(typeof(NTAccount)).ToString();)

Есть предложения для меня?

Ответы [ 3 ]

1 голос
/ 13 марта 2014

Создание членства в группах в многодоменном лесу.

Const ADS_SCOPE_ONELEVEL = 1
Const ADS_SCOPE_SUBTREE = 2

Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand =   CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
Set objRootLDAP = GetObject("LDAP://RootDSE")

objCommand.CommandText = "<LDAP://`your domain A DC full name here`" & ">;(&(objectCategory=group)(name=" & `group name` & ")); samAccountName,distinguishedname,name;subtree"
               objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set oGroup = objCommand.Execute

DGroupName = oGroup.Fields("distinguishedname")
Set objGroup = GetObject("LDAP://" & DGroupName)

For Each obj In objGroup.Members
    i = i + 1

    If left(obj.cn,9)="S-1-5-21-" Then
        objCommand.CommandText = "<LDAP://`your domain B DC full name here`" & ">;(&(objectCategory=person)(objectSID=" & obj.cn & ")); samAccountName,distinguishedname,name;subtree"
               objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
        Set exUser = objCommand.Execute

        exUserAttribute1 = exUser.Fields("sAMAccountName")
        exUserAttribute2 = exUser.Fields("name")
    Else
        UserAttribute1 = obj.sAMAccountName
        UserAttribute1 = obj.cn
    End if
0 голосов
/ 20 сентября 2011

Лучший метод, который я нашел самостоятельно, это запрос к WMI, например:

Sub GetUserFromSID(BYVAL strSID, BYREF strUserName, BYREF strDomainName)
    'given the SID in string/SDDL form, fetch the user and domain names
    'this method should work for local and parent AD domain users (i.e. direct trust)
    '...but it probably won't work for remote domains over transitive trusts
    On Error Resume Next
    Dim objSID : Set objSID = objWMI.Get("Win32_SID='" & strSID & "'")
    strUserName = objSID.AccountName
    strDomainName = objSID.ReferencedDomainName
    On Error Goto 0
    If strDomainName = "NT AUTHORITY" Then strDomainName = GetHostname() 'so it matches active user queries
End Sub

Как видите, мне пришлось добавить обработчик ошибок, а точнее - "вслепую пропускать ошибки", потому что запрос не всегда выполняется успешно (и может быть несколько потенциальных причин, которые не легко проверить).

0 голосов
/ 15 сентября 2011

Вы можете просто привязать ADSI к SID.В VBScript это будет примерно так:

Dim myUser
Set myUser = GetObject("LDAP://<SID=S-1-5-21-...>")
...