簡體   English   中英

Active Directory 搜索顯示屬性 GUID 和 SID 返回 system.Byte[] 而不是實際值

[英]Active Directory Search displaying properties GUID and SID returns system.Byte[] instead of Actual Values

此代碼產生以下輸出:

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());

       }
    }
}

在使用或轉換它們之前,您需要檢查返回值的類型。 de.Properties["anyPropHere"].Value的返回類型是object ,因為它會根據查詢的屬性返回不同的類型。

如果你想獲得objectSid為字符串,你必須使用返回的字節轉換SecurityIdentifier ,如在這個崗位

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM