【问题标题】:ADsDSOObject & .NET return different values (types) for objectSIDADsDSOObject 和 .NET 为 objectSID 返回不同的值(类型)
【发布时间】:2011-05-24 18:01:38
【问题描述】:

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

【问题讨论】:

    标签: sql-server powershell adsi


    【解决方案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 包含你需要的字节数组。

    【讨论】:

    • 不客气,如果可以的话,你能把答案当作好答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2021-06-16
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多