Получить доменное имя - PullRequest
       4

Получить доменное имя

35 голосов
/ 12 ноября 2010

Мой компьютер находится в Домене (Active Directory), и мне нужно получить доменное имя динамически. Я нашел следующий код в интернете:

SelectQuery query = new SelectQuery("Win32_ComputerSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
    foreach (ManagementObject mo in searcher.Get())
    {
        if ((bool)mo["partofdomain"])
        {
            this.Domain = mo["domain"].ToString();
            break;
        }
    }
 }

Он работает точно так, как я хочу, и возвращает именно то имя домена, которое я хочу (когда я вошел в систему как администратор). Если пользователь не является администратором домена, у меня есть исключение Access denied.

Кто-нибудь знает, как получить домен, даже если у него нет прав администратора?

ПРИМЕЧАНИЕ. Я нашел это решение в Интернете System.Environment.UserDomainName;, но оно дает мне только часть имени домена.

т.е. мой домен: something.domain.com и UserDomainName возвращает только something.

Ответы [ 6 ]

91 голосов
/ 12 ноября 2010

Почему вы используете WMI? Разве вы не можете использовать стандартную функциональность .NET?

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
20 голосов
/ 15 июля 2017

Я собираюсь добавить ответ, чтобы попытаться прояснить некоторые вещи здесь, поскольку, кажется, есть некоторая путаница. Основная проблема заключается в том, что люди задают не тот вопрос или, по крайней мере, недостаточно конкретны.

Что на самом деле означает "домен" компьютера ?

Когда мы говорим о «домене» компьютера, мы можем иметь в виду несколько вещей. Ниже приводится не полный список, но он охватывает наиболее распространенные случаи:

  • A пользователь или участник безопасности компьютера может принадлежать домену Active Directory.
  • Основной суффикс поиска DNS сетевого стека может называться «доменом» компьютера.
  • DNS-имя, которое соответствует IP-адресу компьютера, может называться «доменом» компьютера.

Какой я хочу?

Это сильно зависит от того, что вы пытаетесь сделать. Первоначальный автор этого вопроса искал «домен Active Directory» компьютера, что, вероятно, означает, что они ищут домен, к которому принадлежит либо участник безопасности компьютера, либо участник безопасности пользователя. Обычно они нужны, когда вы пытаетесь каким-либо образом общаться с Active Directory. Обратите внимание, что текущий пользователь и субъект компьютера не обязательно находятся в одном домене.

Ответ Питера ван Гинкеля на самом деле дает вам основной суффикс DNS локального сетевого стека (то же самое, что показано в верхней части вывода ipconfig /all). В 99% случаев это, вероятно, то же самое, что и домен, к которому принадлежат как субъект безопасности компьютера, так и субъект аутентифицированного пользователя - , но не обязательно . Обычно это то, что вам нужно, когда вы пытаетесь общаться с устройствами в локальной сети, независимо от того, имеют ли устройства какое-либо отношение к Active Directory. Для многих приложений это все еще будет «достаточно хороший» ответ для общения с Active Directory.

Последний вариант, DNS-имя, является более размытым и более двусмысленным, чем два других. В любом месте от нуля до бесконечности DNS-записи могут преобразовываться в данный IP-адрес, и даже не совсем ясно, какой IP-адрес вас интересует. user2031519 ответ относится к значению HTTP_HOST, что особенно полезно при определении того, как пользователь разрешил ваш HTTP-сервер, чтобы отправить запрос, который вы сейчас обрабатываете. Это почти наверняка не то, что вы хотите, если вы пытаетесь что-то сделать с Active Directory.

Как мне их получить?

Домен текущего участника безопасности пользователя

Это хорошо и просто, вот что ответ Тима дает вам.

System.Environment.UserDomainName

Домен текущего участника безопасности компьютера

Это , вероятно, то, что хотел ОП, для этого нам нужно будет спросить об этом Active Directory.

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()

Этот запрос выдаст ActiveDirectoryObjectNotFoundException, если локальный компьютер не является частью домена или с контроллером домена невозможно связаться.

Основной DNS-суффикс стека

Это - это то, что ответ Питера ван Гинкеля дает вам. Это, вероятно, не совсем то, что вы хотите, но есть хороший шанс, что это достаточно хорошо для вас - если это не так, вы, вероятно, уже знаете, почему.

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName

DNS-имя, которое соответствует IP-адресу компьютера

Этот хитрый, и нет однозначного ответа на него. Если это то, что вам нужно, прокомментируйте ниже, и я с удовольствием расскажу о вашем сценарии использования и помогу вам найти лучшее решение (и подробно остановлюсь на этом ответе).

13 голосов
/ 03 июня 2014

Я нашел этот вопрос по названию. Если кто-то ищет ответ о том, как просто получить доменное имя, используйте следующую переменную среды.

System.Environment.UserDomainName

Мне известно, что автор вопроса упоминает об этом, но я пропустил его с первого взгляда и подумал, что кто-то другой может сделать то же самое.

Затем задайте описание вопроса полное доменное имя (FQDN) .

1 голос
/ 19 ноября 2014

Я знаю, что это старый. Я просто хотел сделать это здесь для всех, кто искал ответ на вопрос о получении доменного имени. Это согласуется с ответом Петра. Как утверждает Рич, есть «есть» ошибка. Но вы всегда можете сделать простой обходной путь для этого. Я могу определить, находятся ли они в домене или нет, путем проверки связи с доменным именем. Если он отвечает, продолжайте с тем, для чего мне нужен домен. Если это не удается, я выпадаю и перехожу в «автономный» режим. Простой строковый метод.

 string GetDomainName()
    {
        string _domain = IPGlobalProperties.GetIPGlobalProperties().DomainName;

        Ping ping = new Ping();

        try
        {
            PingReply reply = ping.Send(_domain);

            if (reply.Status == IPStatus.Success)
            {
                return _domain;
            }
            else
            {
                return reply.Status.ToString();
            }
        }
        catch (PingException pExp)
        {
            if (pExp.InnerException.ToString() == "No such host is known")
            {
                return "Network not detected!";
            }

            return "Ping Exception";
        }
    }
1 голос
/ 12 ноября 2010

Если вы хотите, чтобы определенные пользователи имели доступ ко всему или части пространства объектов WMI, вам нужно разрешить им, как показано здесь . Обратите внимание, что для выполнения этой настройки вы должны работать как администратор.

0 голосов
/ 25 августа 2014
 protected void Page_Init(object sender, EventArgs e)
 {
   String hostdet = Request.ServerVariables["HTTP_HOST"].ToString();
 }
...