VBS脚本获取安全标识符SID(Security Identifiers)的方法

一、SID简介  

    SID也就是安全标识符(Security Identifiers),是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID。Windows 2000 中的内部进程将引用帐户的 SID 而不是帐户的用户或组名。如果创建帐户,再删除帐户,然后使用相同的用户名创建另一个帐户,则新帐户将不具有授权给前一个帐户的权力或权限,原因是该帐户 具有不同的 SID 号。安全标识符也被称为安全 ID 或 SID。

    一个完整的SID包括:

    • 用户和组的安全描述

    • 48-bit的ID authority

    • 修订版本

    • 可变的验证值Variable sub-authority values

例:S-1-5-21-343818398-299502267-839522115-500

参考资料:http://www.5dmail.net/html/2004-8-1200481181008.htm

二、VBS脚本获取SID

    方法一:

Set objNetwork = CreateObject(Wscript.Network)

strComputer = objNetwork.ComputerName获取当前的机器名

strUserName=objNetwork.UserName获取当前的用户名

Set objLocalSam =GetObject(WinNT:// & strComputer & / & strUserName)这里做了修改,scottlocke中默认strUserName为”Administrator”是不保险的

Wscript.echo SIDArray(objLocalSam.objectSID)

Function SIDArray(bar)

   Converts Binary Array into Human readable eg: S-1-5-21-XXXXX-XXXXX-XXXXX-XXX

  dim seperator,sid,length

  seperator = ””

  sid = ””

  for length = 1 to lenb(bar)

    sid = sid & seperator & right(0 & hex(ascb(midb(bar,length,1))),2)

    seperator = ,

  Next

  SIDArray = sid

  SID = Split(SIDArray,,)

 Convert into standard viewable format - little endian format for 4 byte groups

SID1 = (HexToDec(Mid(SID(15), 11))268435456+ (HexToDec(Mid(SID(15), 22))16777216+ (HexToDec(Mid(SID(14), 11))1048576+ (HexToDec(Mid(SID(14), 22))65536+ (HexToDec(Mid(SID(13), 11))4096+ (HexToDec(Mid(SID(13), 22))256+ (HexToDec(Mid(SID(12), 11))*16+ HexToDec(Mid(SID(12), 22))

SID2 = (HexToDec(Mid(SID(19), 11))268435456+ (HexToDec(Mid(SID(19), 22))16777216+ (HexToDec(Mid(SID(18), 11))1048576+ (HexToDec(Mid(SID(18), 22))65536+ (HexToDec(Mid(SID(17), 11))4096+ (HexToDec(Mid(SID(17), 22))256+ (HexToDec(Mid(SID(16), 11))*16+ HexToDec(Mid(SID(16), 22))

SID3 = (HexToDec(Mid(SID(23), 11))268435456+ (HexToDec(Mid(SID(23), 22))16777216+ (HexToDec(Mid(SID(22), 11))1048576+ (HexToDec(Mid(SID(22), 22))65536+ (HexToDec(Mid(SID(21), 11))4096+ (HexToDec(Mid(SID(21), 22))256+ (HexToDec(Mid(SID(20), 11))*16+ HexToDec(Mid(SID(20), 22))

RID = (HexToDec(Mid(SID(27), 11))268435456+ (HexToDec(Mid(SID(27), 22))16777216+ (HexToDec(Mid(SID(26), 11))1048576+ (HexToDec(Mid(SID(26), 22))65536+ (HexToDec(Mid(SID(25), 11))4096+ (HexToDec(Mid(SID(25), 22))256+ (HexToDec(Mid(SID(24), 11))*16+ HexToDec(Mid(SID(24), 22))

 Cheating here by just prepending the S-1-5-21-

SIDArray = S-1-5-21- & SID1 & - & SID2 & - & SID3 & - & RID

End Function 

Function HexToDec(ByVal sHex)

HexToDec = ”” & CLng(&H & sHex)

End Function

参考资料:http://www.scottlocke.net/vbscript-to-retrieve-sid.html

方法二:

Function ShowSID(strUser)     On Error Resume Next     Dim oWMI, oAs, oA, sSid     Set oWMI = GetObject("winmgmts:\\.\root\cimv2")     If strUser <> "" Then         Set oAs = oWMI.ExecQuery("Select SID From Win32_Account" & _                   " WHERE SIDType=1 AND Name='" & strUser & "'")         For Each oA In oAs             sSid= Mid(oA.SID, InStrRev(oA.SID, "-"+ 1)             WScript.Echo "Short SID: " & sSid & " (" & HEX(sSid) & "H)"         Next     Else         Set oAs = oWMI.ExecQuery("Select Name, SID From Win32_Account WHERE SIDType=1")         For Each oA In oAs             WScript.Echo "User: " & oA.Name & _                     vbCrLf & vbTab & "SID: " & oA.SID         Next     End If     Set oA = Nothing     Set oAs = Nothing     Set oWMI = Nothing     If Err.Number <> 0 Then         WScript.Echo "Error ocurred: " & Err.Description         Err.Clear     End If End Function

[温馨提示]:该文章由原博客园导入而来,如排版效果不佳,请移步:http://www.cnblogs.com/coderzh/archive/2007/10/17/927315.html

微信扫一扫交流

作者:CoderZh
微信关注:hacker-thinking (一个程序员的思考)
本文出处:https://blog.coderzh.com/2007/10/17/927315/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。