سؤال

أنا أستخدم System.DirectoryServices.AccountManagement جزء من مكتبة .NET للتفاعل مع Activedirectory.

بعد استدعاء getMembers () على كائن groupprincipal وتصفية النتائج ، لدي الآن مجموعة من الكائنات المستخدمة

GroupPrincipal myGroup;  // population of this object omitted here 

foreach (UserPrincipal user in myGroup.GetMembers(false).OfType<UserPrincipal>())
{
    Console.WriteLine(user.SamAccountName);
}

ستقوم عينة الكود أعلاه بطباعة أسماء المستخدمين مثل "Testuser1". أحتاج إلى مقارنة هذه القائمة القادمة من تطبيق آخر بتنسيق "Domain testuser1".

كيف أحصل على جزء "المجال" من كائن المستخدم؟

لا يمكنني فقط إلحاق اسم المجال المعروف لأن هناك مجالات متعددة متورطة وأحتاج إلى التمييز بين المجال 1 testuser1 و Domain2 Testuser2.

هل كانت مفيدة؟

المحلول

لديك خياران يمكنني التفكير فيهما.

  1. تحليل ، أو خذ كل ما هو عليه ، حق name@fully.qualified.domain.name;
  2. استخدم ال System.DirectoryServices مساحة الاسم.

لا أعرف عن المستخدم, ، لا أنا عن Groupprincipal. من ناحية أخرى ، أعرف طريقة عمل لتحقيق ما تريد.

[TestCase("LDAP://fully.qualified.domain.name", "TestUser1")] 
public void GetNetBiosName(string ldapUrl, string login)
    string netBiosName = null;
    string foundLogin = null;

    using (DirectoryEntry root = new DirectoryEntry(ldapUrl))
        Using (DirectorySearcher searcher = new DirectorySearcher(root) {
            searcher.SearchScope = SearchScope.Subtree;
            searcher.PropertiesToLoad.Add("sAMAccountName");
            searcher.Filter = string.Format("(&(objectClass=user)(sAMAccountName={0}))", login);

            SearchResult result = null;

            try {
                result = searcher.FindOne();

                if (result == null) 
                    if (string.Equals(login, result.GetDirectoryEntry().Properties("sAMAccountName").Value)) 
                        foundLogin = result.GetDirectoryEntry().Properties("sAMAccountName").Value
            } finally {
                searcher.Dispose();
                root.Dispose();
                if (result != null) result = null;
            }
        }

    if (!string.IsNullOrEmpty(foundLogin)) 
        using (DirectoryEntry root = new DirectoryEntry(ldapUrl.Insert(7, "CN=Partitions,CN=Configuration,DC=").Replace(".", ",DC=")) 
            Using DirectorySearcher searcher = new DirectorySearcher(root)
                searcher.Filter = "nETBIOSName=*";
                searcher.PropertiesToLoad.Add("cn");

                SearchResultCollection results = null;

                try {
                    results = searcher.FindAll();

                    if (results != null && results.Count > 0 && results[0] != null) {
                        ResultPropertyValueCollection values = results[0].Properties("cn");
                        netBiosName = rpvc[0].ToString();
                } finally {
                    searcher.Dispose();
                    root.Dispose();

                    if (results != null) {
                        results.Dispose();
                        results = null;
                    }
                }
            }

    Assert.AreEqual("INTRA\TESTUSER1", string.Concat(netBiosName, "\", foundLogin).ToUpperInvariant())
}

معلومات أو روابط أخرى ذات صلة متوفرة في هذا السؤال.
C# Active Directory: الحصول على اسم المجال للمستخدم؟
كيفية العثور على اسم NetBios للمجال

نصائح أخرى

استخدم مكتبة COM COM ، لديها ترجمة أسماء مدمجة تعمل ولا تقدم أي افتراضات (مثل الإجابات الأخرى هنا).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ActiveDs;

namespace Foo.Repository.AdUserProfile
{
    public class ADUserProfileValueTranslate
    {
        public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName)
        {
            NameTranslate nameTranslate = new NameTranslate();
            nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName);
            return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4);
        }
    }
}

هل حاولت تمرير اسم المجال المؤهل بالكامل إلى هذا التطبيق الآخر؟ لن يشتكي معظم واجهة برمجة تطبيقات Windows إذا قمت بذلك fully_qualified_domain\USER.

يمكنك البحث عن المجالات الممكنة في خاصية user.distinguisedName. يجب أن يحتوي المستخدم في المجال 1 على السلسلة "DC = DOMAIN1". بالتأكيد لا ينبغي أن تحتوي على السلسلة "dc = domain2".

كما هو مذكور في أحد التعليقات على السؤال ، أعتقد أن هذا إجابة جيدة لأكثر حداثة:

 user.Sid.Translate(typeof(System.Security.Principal.NTAccount)).ToString()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top