sql-server - ADsDSOObject和.NET为objectSID返回不同的值(类型)

标签 sql-server powershell adsi

我在数据库服务器中有一个用户创建的存储过程,该存储过程查询 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/

相关文章:

调用 GetObject ("WinNT://JohnDoe,User"时出现 VBScript 错误)

powershell - 访问被拒绝将域用户添加到本地管理员组

sql - 如何通过保留数据将现有表更改为 SQL 临时表?

sql - 将 Temp 列的结果连接到 SQL Server 表

powershell - 我们如何识别由不同对象打开的两个excel.exe进程?

Python、PowerShell 还是其他?

sql-server - 如何使用另一个表中的记录作为列名创建 SQL 表变量

c# - DbGeography 用圆心和半径做圆

powershell - 为什么在这个例子中我们需要括号?

powershell - 在PowerShell 5.0中打印本地组成员