2011-09-15 48 views
0

最近,我正在研究純VBScript中的系統管理腳本,其中的要求是它必須是便攜式的,無需安裝額外的軟件。在VBScript中從SID字符串獲取域用戶名的方法

我有字符串版本的SID(例如「S-1-5-21-123456789 ...」)並且想要獲取用戶名和域名。

嘗試通過WMI執行此操作失敗的部分原因是它必須在域控制器上搜索10,000個對象。

但或許這是可以做到的這些方法之一:

  1. via p/invoke from ADVAPI32.DLL's LookupAccountSid function

  2. 如果我們可以假設.NETfx 2.0安裝(我真的寧願避免,因爲它不會完全便攜),via the System.Security.Principal(以C#爲例:using System.Security.Principal; string account = new SecurityIdentifier(stringSid).Translate(typeof(NTAccount)).ToString();

對我有何建議?

回答

0

我有我自己找到的最好的方法是查詢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 

正如你看到的,我不得不添加一些錯誤handli - 而是 - 「盲目地跳過錯誤」,因爲查詢並不總是成功的(並且可能有一些不容易測試的潛在原因)。

+0

由於這種方法在大多數情況下都能正常工作,所以對於特定的任務來說可行。但我確實想知道更可靠的方法... – ewall

0

您可以簡單地將ADSI綁定到SID。在VBScript中,這將是這樣的:

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

這給出了以下錯誤(如果給定的SID是域或本地):「(空):服務器不可操作。」顯然它需要一個目標服務器來查詢,但我無法找到適用於此的LDAP DN字符串。你能詳細說明嗎? – ewall

+0

你可以發佈你使用的代碼嗎? –

+0

您的建議?任何類似'Set myUser = GetObject(「LDAP:// S-1-5-21-964382842-1330588478-199955091-103152」)'或Set myUser = GetObject(「LDAP:// 「)'或'Set myUser = GetObject(」LDAP:// 「)'all give error ... – ewall

1

在多域林中構建組成員身份。

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 
相關問題