簡體   English   中英

獲取 AD 組成員的 DirectoryEntry 時如何處理特殊字符?

[英]How to handle special characters when getting a DirectoryEntry for an AD group member?

我試圖在我的應用程序中獲取(可配置的)AD 組的所有成員,我注意到在某些情況下我收到錯誤,例如System.Runtime.InteropServices.COMException (0x80005000) 獲取組本身的 DirectoryEntry 工作正常,但問題出現在這段代碼中,我在其中迭代組成員:

int membersFound = 0;

while (true)
{
    PropertyValueCollection members = group.Properties["member"];

    foreach (string member in members)
    {
        using (DirectoryEntry memberEntry = new DirectoryEntry($"GC://{member}"))
        {
            memberEntry.RefreshCache(new[] { "objectClass", "msDS-PrincipalName", "displayname", "cn" });
            bool isGroup = memberEntry.Properties["objectClass"]?.Contains("group") == true;
            string userName = memberEntry.Properties["msDS-PrincipalName"]?.Value?.ToString();

            if (!isGroup && !string.IsNullOrEmpty(userName))
            {
                // ...
            }
        }
    }

    if (members.Count == 0)
    {
        break;
    }

    membersFound += members.Count;

    try
    {
        group.RefreshCache(new[] { $"member;range={membersFound}-*" });
    }
    catch (COMException e)
    {
        if (e.ErrorCode == unchecked((int)0x80072020))
        {
            break;
        }

        throw;
    }
}

似乎我不能像我目前所做的那樣簡單地將member字符串傳遞給DirectoryEntry構造函數,因為如果字符串包含某些字符,例如“/”,則在調用memberEntry.RefreshCache()時會出現異常。 我還注意到,在“/”的情況下,當我在將它傳遞給DirectoryEntry構造函數之前用反斜杠對其進行轉義時,它似乎可以解決問題。 但是,我不知道在這里我還需要做什么來確保我的代碼始終有效,無論member字符串中可能有什么特殊字符。 是否有任何函數可以用來格式化已經解決了這個問題的字符串,或者我必須做些什么來防止由我的代碼中的特殊字符引起的任何問題?

你將不得不自己逃避斜線。 member屬性包含每個成員的distinguishedName列表。 但是在distinguishedName ,正斜杠沒有特殊含義,因此斜杠不會被轉義。 但是在 LDAP 字符串中,正斜杠確實具有特殊含義。

所以只需使用字符串Replace

new DirectoryEntry($"GC://{member.Replace("/", "\\/")}")

暫無
暫無

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

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