Получить nETBIOSName из объекта UserPrincipal - PullRequest
12 голосов
/ 26 ноября 2010

Я использую часть System.DirectoryServices.AccountManagement библиотеки .Net для взаимодействия с ActiveDirectory.

Вызвав GetMembers () для объекта GroupPrincipal и отфильтровав результаты, у меня теперь есть коллекция объектов UserPrincipal

GroupPrincipal myGroup;  // population of this object omitted here 

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

Приведенный выше пример кода выведет имена пользователей, например «TestUser1». Мне нужно сравнить их со списком из другого приложения в формате «DOMAIN \ TestUser1».

Как получить часть "DOMAIN" из объекта UserPrincipal?

Я не могу просто добавить известное доменное имя, так как участвуют несколько доменов, и мне нужно различать DOMAIN1 \ TestUser1 и DOMAIN2 \ TestUser2.

Ответы [ 5 ]

4 голосов
/ 26 ноября 2010

У вас есть два варианта, которые я могу придумать.

  1. Разобрать или взять все, что включено, справа от name@fully.qualified.domain.name;
  2. Использовать пространство имен System.DirectoryServices.

Я не знаю о UserPrincipal , равно как и о 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())
}

Другая связанная информация или ссылки, доступные в этом вопросе SO.
C # Active Directory: получить доменимя пользователя?
Как найти NetBIOS-имя домена

2 голосов
/ 05 июня 2011

Используйте COM-библиотеку ActiveDs, она имеет встроенный перевод имен, который работает и не делает никаких предположений (как и другие ответы здесь).

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);
        }
    }
}
0 голосов
/ 27 июля 2017

Как уже упоминалось в одном из комментариев к вопросу, я думаю, что это хороший ответ для более поздних времен:

 user.Sid.Translate(typeof(System.Security.Principal.NTAccount)).ToString()
0 голосов
/ 20 августа 2012

Вы можете искать возможные домены в свойстве user.DistinguishedName.Пользователь в Домене 1 должен содержать строку «DC = DOMAIN1».Он определенно не должен содержать строку "DC = DOMAIN2".

0 голосов
/ 26 ноября 2010

Вы пытались передать полное доменное имя этому другому приложению? Большинство Windows API не будут жаловаться, если вы сделаете fully_qualified_domain\USER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...