ADsDSOObject& .NET为objectSID返回不同的值(类型)

时间:2011-05-24 18:01:38

标签: sql-server powershell adsi

我在数据库服务器中创建了一个用户创建的存储过程,该服务器查询活动目录以获取用户信息并将数据插入表中。我们希望从数据库服务器中删除操作,并在外部调用(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表示转换为十六进制?

1 个答案:

答案 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包含您需要的字节数组。