我在数据库服务器中创建了一个用户创建的存储过程,该服务器查询活动目录以获取用户信息并将数据插入表中。我们希望从数据库服务器中删除操作,并在外部调用(PowerShell或C#)中执行初始AD查询和数据插入。
存储过程使用sp_OA过程创建ADsDSOObject来执行实际的AD查询。看来ADsDSOObject默认以十六进制形式返回objectSID。以下是输出值的示例。
-- ADsDSOObject: 0x010500000000000515000000D94242061941C67FC9004A20EE030000
当我通过PowerShell运行ADSI查询时,我得到一个objectSID的字节数组,我可以通过.NET System.Security.Principal.SecurityIdentifier(<objectSID>
,0)将其变成一个字符串。
这将以适当的SID格式返回实际的字符串SID标识符。
-- Byte Array: {1, 5, 0, 0, 0, 0, 0, 5, 21, 0, 0, 0, 217, 66, 66, 6, 25, 65, 198, 127, 201, 0, 74, 32, 245, 1, 0, 0}
-- .NET SID: S-1-5-21-105005785-2143699225-541720777-501
但是,我需要将数据存储为二进制文件,以便用.NET解决方案替换数据库中的过程,以避免应用程序中的任何更改。
使用PowerShell或C#,是否有人知道如何将字节数组转换为十六进制或如何将字符串SID表示转换为十六进制?
答案 0 :(得分:1)
这是一个解决方案:
PS> $sid = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-21-105005785-2143699225-541720777-501")
PS> $c = New-Object 'byte[]' $sid.BinaryLength
PS> $sid.GetBinaryForm($c, 0)
$ c包含您需要的字节数组。