从 Active Directory 读取 objectGUID - 从 BuiltIn-Groups 读取时出现问题
Reading objectSID from ActiveDirectory - problem when reading from BuildIn-Groups
我需要在我的项目中使用 LdapConnection 类,因为 DirectoryEntry/DirectorySearcher 不支持忽略 LDAPS 的自签名证书 - 当我迁移我的代码时,我 运行 遇到了问题从 BuiltIn-Groups 读取 objectGuid 时 - 格式与自定义添加的组不同 - 并且 return 值很奇怪,无法转换为任何内容
这里有 2 个代码示例可以说明我的问题 - 或者更好的是不同的结果
LdapConnection conn = new LdapConnection("va.dev");
var filter = "(objectClass=group)";
var searchRequest = new SearchRequest("OU=Developer Goups,DC=va,DC=dev", filter, System.DirectoryServices.Protocols.SearchScope.OneLevel, "sAMAccountName", "description", "distinguishedName", "objectSid");
var response = conn.SendRequest(searchRequest) as SearchResponse;
var objectSid = response.Entries[0].Attributes["objectSid"][0];
objectSid 的结果是 Byte[] - 我可以将它转换为 SecureIdentifier 或字符串 - 无论我需要什么
现在读取内置组的相同代码
LdapConnection conn = new LdapConnection("va.dev");
var filter = "(objectClass=group)";
var searchRequest = new SearchRequest("CN=Builtin,DC=va,DC=dev", filter, System.DirectoryServices.Protocols.SearchScope.OneLevel, "sAMAccountName", "description", "distinguishedName", "objectSid");
var response = conn.SendRequest(searchRequest2) as SearchResponse;
var objectSid = response.Entries[0].Attributes["objectSid"][0];
现在第一个内置组(以及所有其他组)的结果非常奇怪 - 看起来像这样
"\u0001\u0002[=29=][=29=][=29=][=29=][=29=]\u0005 [=30=][=30=][=30=],\u0002[=31=][=31=]"(字符串类型)
无法将其转换为任何已知数据类型 - 内置组和手动添加的组之间的区别在于 SID 长度 - 例如自定义组的 objectSID 是“S-1-5-21- 978504927-3573220367-3221873571-1300" 和内置组 "S-1-5-32-548"。
在我使用 DirectorySearcher 和 DirectoryEntry 之前 - 通过这些 类 我在两个条目上都得到了一个有效的字节数组作为 return 值 - 我能做些什么来让它工作吗?! ?将字节数组转换为可读字符串我有:-)
您收到的字符串实际上是 SID 值的二进制表示(每个字符 = 1 个字节)。
将其转换为字节数组:
using System.Text.Encoding;
// ...
var binaryForm = Encoding.Ascii.GetBytes(objectSid);
... 或:
var binaryForm = objectSid.Select(ch => (byte)ch).ToArray();
然后根据二进制形式实例化一个新的SecurityIdentifier
:
var sid = new SecurityIdentifier(binaryForm, 0);
我需要在我的项目中使用 LdapConnection 类,因为 DirectoryEntry/DirectorySearcher 不支持忽略 LDAPS 的自签名证书 - 当我迁移我的代码时,我 运行 遇到了问题从 BuiltIn-Groups 读取 objectGuid 时 - 格式与自定义添加的组不同 - 并且 return 值很奇怪,无法转换为任何内容
这里有 2 个代码示例可以说明我的问题 - 或者更好的是不同的结果
LdapConnection conn = new LdapConnection("va.dev");
var filter = "(objectClass=group)";
var searchRequest = new SearchRequest("OU=Developer Goups,DC=va,DC=dev", filter, System.DirectoryServices.Protocols.SearchScope.OneLevel, "sAMAccountName", "description", "distinguishedName", "objectSid");
var response = conn.SendRequest(searchRequest) as SearchResponse;
var objectSid = response.Entries[0].Attributes["objectSid"][0];
objectSid 的结果是 Byte[] - 我可以将它转换为 SecureIdentifier 或字符串 - 无论我需要什么
现在读取内置组的相同代码
LdapConnection conn = new LdapConnection("va.dev");
var filter = "(objectClass=group)";
var searchRequest = new SearchRequest("CN=Builtin,DC=va,DC=dev", filter, System.DirectoryServices.Protocols.SearchScope.OneLevel, "sAMAccountName", "description", "distinguishedName", "objectSid");
var response = conn.SendRequest(searchRequest2) as SearchResponse;
var objectSid = response.Entries[0].Attributes["objectSid"][0];
现在第一个内置组(以及所有其他组)的结果非常奇怪 - 看起来像这样
"\u0001\u0002[=29=][=29=][=29=][=29=][=29=]\u0005 [=30=][=30=][=30=],\u0002[=31=][=31=]"(字符串类型)
无法将其转换为任何已知数据类型 - 内置组和手动添加的组之间的区别在于 SID 长度 - 例如自定义组的 objectSID 是“S-1-5-21- 978504927-3573220367-3221873571-1300" 和内置组 "S-1-5-32-548"。
在我使用 DirectorySearcher 和 DirectoryEntry 之前 - 通过这些 类 我在两个条目上都得到了一个有效的字节数组作为 return 值 - 我能做些什么来让它工作吗?! ?将字节数组转换为可读字符串我有:-)
您收到的字符串实际上是 SID 值的二进制表示(每个字符 = 1 个字节)。
将其转换为字节数组:
using System.Text.Encoding;
// ...
var binaryForm = Encoding.Ascii.GetBytes(objectSid);
... 或:
var binaryForm = objectSid.Select(ch => (byte)ch).ToArray();
然后根据二进制形式实例化一个新的SecurityIdentifier
:
var sid = new SecurityIdentifier(binaryForm, 0);