2

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

4

1 回答 1

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

于 2011-05-24T19:03:50.143 回答