Active Directory搜索显示属性GUID和SID返回system.Byte []而不是实际值

时间:2018-10-02 15:30:57

标签: c#

此代码产生以下输出:

my email address,
System.Byte[], this should be SID
System.Byte[], this should be GUID
my name,
First Name,
last Name,
Middle Initial

代码:

Console.WriteLine(((byte)de.Properties["objectSid"].Value.ToString());

我试图投射上面的文字。我收到错误

  

无法将类型字符串转换为字节

string ObjGuid = BitConverter.ToString(de.Properties["objectguid"].Value);

我尝试了与上面的代码行相同的响应

((byte)de.Properties["ObjectGUID"]).Value.ToString();
  

无法将类型SystemDirectoryServices.PropertyValueCollection转换为字节

byte one = Encoding.UTF8.GetString(de.Properties["ObjectGUID"]));
  

无法将类型SystemDirectoryServices.PropertyValueCollection转换为字节

这些是我尝试过的项目。 Console.WriteLine需要一个字符串。

我看到的问题是我正在获取物品清单。

从此列表中,我正在获取基础属性。

我只收集属性集合中的几项。

我正在基础集合内进行搜索,并且尝试进行转换 将该项目转换为字符串

我认为这是从字节到字符串的基本转换。我可能在搜索和操作对象层次结构时遇到问题。

有人可以帮助我解决这个问题吗?

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Principal;
using System.Threading;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices;
using System.IO;
using System.Data;
using System.Management.Automation;
using System.Collections.ObjectModel;

//using System.DirectoryServices;
namespace TestRole
{
  class Program
  {
    static void Main(string[] args)
    {
        //Requires Add References to using System.DirectoryServices.AccountManagement;
        // and using System.DirectoryServices;


        PrincipalContext ctx = new 
               PrincipalContext(ContextType.Domain,Environment.UserDomainName);
        UserPrincipal user = new UserPrincipal(ctx);

        user.EmailAddress = "MyEmail@com";

        PrincipalSearcher ps = new PrincipalSearcher();
        ps.QueryFilter = user;
        PrincipalSearchResult<Principal> results = ps.FindAll();
        Principal pc = results.ToList()[0];
        DirectoryEntry de = (DirectoryEntry)pc.GetUnderlyingObject();

        Console.WriteLine(de.Properties["mail"].Value.ToString());

      //old code
        ////Console.WriteLine(de.Properties["Sid"].Value.ToString());
        //Console.WriteLine(de.Properties["objectSid"].Value.ToString());
        //Console.WriteLine(de.Properties["objectGUID"].Value.ToString());
        //This code does the job
            var sid = new 
             SecurityIdentifier((byte[])de.Properties["objectSid"].Value, 0);
               Console.WriteLine(sid);
            var guid = new Guid((Byte[])de.Properties["objectGUID"].Value);
               Console.WriteLine(guid.ToString());


        Console.WriteLine(de.Properties["Name"].Value.ToString());
        Console.WriteLine(de.Properties["givenname"].Value.ToString());
        Console.WriteLine(de.Properties["sn"].Value.ToString());
        Console.WriteLine(de.Properties["initials"].Value.ToString());


        Console.WriteLine(Environment.UserDomainName);


        //Console.WriteLine(de.Properties["StructuralObjectClass"].Value.ToString());

       }
    }
}

1 个答案:

答案 0 :(得分:1)

使用或转换它们之前,您需要检查返回值的类型。 de.Properties["anyPropHere"].Value的返回类型为object,因为它会返回不同的类型,具体取决于查询的属性。

如果要获取objectSid作为字符串,则必须使用SecurityIdentifier转换返回的字节,如this post

所述。
byte[] sid = (byte[])de.Properties["objectSid"].Value;
string sidStr = (new SecurityIdentifier((byte[])sid, 0)).ToString();