Подтвердить что ты не робот

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

Мой компьютер находится в домене (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.

4b9b3361

Ответ 1

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

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

Ответ 2

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

System.Environment.UserDomainName

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

В чем последует описание вопроса, это полное доменное имя (FQDN).

Ответ 3

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

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

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

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

Какой я хочу?

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

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

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

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

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

Это, славное и простое, это то, что ответ Тима дает вам.

System.Environment.UserDomainName

Домен текущего владельца безопасности компьютера

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

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()

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

Первичный DNS-суффикс сетевого стека

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

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

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

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

Ответ 4

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

Ответ 5

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

 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";
        }
    }

Ответ 6

 protected void Page_Init(object sender, EventArgs e)
 {
   String hostdet = Request.ServerVariables["HTTP_HOST"].ToString();
 }