我在数据库服务器中有一个用户创建的存储过程,该存储过程查询 Activity 目录以获取用户信息并将数据插入表中。我们希望从数据库服务器中删除该操作,并在外部调用(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表示形式转换为十六进制?
最佳答案
这是一个解决方案:
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包含您需要的字节数组。
关于sql-server - ADsDSOObject和.NET为objectSID返回不同的值(类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6114798/