vbscript - 使用 ADODB 检索 AD SID 返回不正确的 SID

标签 vbscript active-directory ldap

我有一个在登录时运行的脚本来执行一些配置文件操作,但它返回了错误的 SID。当使用 powershell 执行相同操作时,我得到了正确的 SID。我已经研究了一整天,似乎无法确定该脚本的哪一部分会导致返回不正确的 SID。

这可能与域基础设施有关吗?

鉴于下面有一个好的 SAM,我返回了一个好的 SID,但它不是正确的 SID。该用户对象没有 SID 历史记录,因此我很困惑为什么会得到不正确的 SID。

'* Build LDAP query to lookup user
Set rootDSE = GetObject("LDAP://RootDSE")
base  = "<LDAP://" & rootDSE.Get("defaultNamingContext") & ">"
'* Filter on user objects with the given account name
fltr  = "(&(objectClass=user)(objectCategory=Person)" & _
        "(sAMAccountName=" & strSamAccountName & "))"
'* Add other attributes according to your requirements
attr  = "distinguishedName,sAMAccountName,objectSid,userPrincipalName"
scope = "subtree"
Set conn = CreateObject("ADODB.Connection")
conn.Provider = "ADsDSOObject"
conn.Open "Active Directory Provider"
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = base & ";" & fltr & ";" & attr & ";" & scope
outFile.WriteLine("Command Text" & cmd.CommandText)
outFile.WriteLine()

'* Retrieve SID from user object, convert to decimal and hex values
Set rs = cmd.Execute
Do Until rs.EOF
  arrSid = rs.Fields("objectSid").Value
  strSidHex = OctetToHexStr(arrSid) 
  strSidDec = HexStrToDecStr(strSidHex) 
  'strUPN = rs.Fields("userPrincipalName").Value
  Dim objTranslator
  Set objTranslator = CreateObject("NameTranslate")
  objTranslator.Init 3, ""
  objTranslator.Set 3, strUPN
  strGUID = objTranslator.Get(7)
  outFile.WriteLine("DN:  " & rs.Fields("distinguishedName").Value)
  outFile.WriteLine("SID: " & strSidDec)
  outFile.WriteLine("UPN: " & rs.Fields("userPrincipalName").Value)
  outFile.WriteLine()
  rs.MoveNext
Loop
rs.Close
conn.Close

'* Function to convert OctetString (byte array) to Hex string. 
Function OctetToHexStr(arrbytOctet) 
  Dim k 
  OctetToHexStr = "" 
  For k = 1 To Lenb(arrbytOctet) 
  OctetToHexStr = OctetToHexStr _ 
  & Right("0" & Hex(Ascb(Midb(arrbytOctet, k, 1))), 2) 
  Next 
End Function 

'* Function to convert hex Sid to decimal (SDDL) Sid. 
Function HexStrToDecStr(strSid) 
  Dim arrbytSid, lngTemp, j 
  ReDim arrbytSid(Len(strSid)/2 - 1) 
  For j = 0 To UBound(arrbytSid) 
    arrbytSid(j) = CInt("&H" & Mid(strSid, 2*j + 1, 2)) 
  Next 
  HexStrToDecStr = "S-" & arrbytSid(0) & "-" _ 
  & arrbytSid(1) & "-" & arrbytSid(8) 
  lngTemp = arrbytSid(15) 
  lngTemp = lngTemp * 256 + arrbytSid(14) 
  lngTemp = lngTemp * 256 + arrbytSid(13) 
  lngTemp = lngTemp * 256 + arrbytSid(12) 
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp) 
  lngTemp = arrbytSid(19) 
  lngTemp = lngTemp * 256 + arrbytSid(18) 
  lngTemp = lngTemp * 256 + arrbytSid(17) 
  lngTemp = lngTemp * 256 + arrbytSid(16) 
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp) 
  lngTemp = arrbytSid(23) 
  lngTemp = lngTemp * 256 + arrbytSid(22) 
  lngTemp = lngTemp * 256 + arrbytSid(21) 
  lngTemp = lngTemp * 256 + arrbytSid(20) 
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp) 
  lngTemp = arrbytSid(25) 
  lngTemp = lngTemp * 256 + arrbytSid(24) 
  HexStrToDecStr = HexStrToDecStr & "-" & CStr(lngTemp) 
End Function 

最佳答案

您的函数 HexToDecStr() 假定二进制 SID 始终为 26 字节长。那isn't necessarily true 。试试这个:

Function DecodeSID(binSID)
  Dim i, sid

  ReDim bytes(LenB(binSID))
  For i = 1 To LenB(binSID)
    bytes(i-1) = AscB(MidB(binSID, i, 1))
  Next

  sid = "S-" & CStr(bytes(0)) & "-" & _
        Arr2Str(Array(bytes(2), bytes(3), bytes(4), bytes(5), bytes(6), bytes(7)))
  For i = 8 To (4 * bytes(1) + 4) Step 4
    sid = sid & "-" & Arr2Str(Array(bytes(i+3), bytes(i+2), bytes(i+1), bytes(i)))
  Next

  DecodeSID = sid
End Function

Function Arr2Str(arr)
  Dim i, v

  v = 0
  For i = 0 To UBound(arr)
    v = v * 256 + arr(i)
  Next

  Arr2Str = CStr(v)
End Function

关于vbscript - 使用 ADODB 检索 AD SID 返回不正确的 SID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26997316/

相关文章:

tomcat - 在 Websphere Application Server 9.0 中为 SSO 生成 Ltpa token

java - WebSecurityConfig Java 相当于使用 spring-security.xml 完成的 spring LDAP 身份验证

Java LDAP 正常断开连接

vbscript - 根据组合框中的选择填充文本框

powershell - 检查用户是否是远程服务器上本地管理员组的成员

javascript - 在 VBScript 中引用全局变量的方式与在 Javascript 中的 window ["var_name"] 相同

jenkins slave 以用户身份运行

c# - 具有双重身份验证的应用程序 : custom and Active Directory

vbscript - 仅检索数字并忽略字符串中的字母

javascript - 如何使用 javascript 或 jquery 在客户端机器上创建文本文件