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

Как получить имя машины клиента в ASP.NET/С#?

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

string clientPCName;
string[] computer_name = System.Net.Dns.GetHostEntry(
Request.ServerVariables["remote_host"]).HostName.Split(new Char[] { '.' });
clientPCName = computer_name[0].ToString(); 

В локальном он возвращает точно имя моего компьютера.
Но на сервере я получаю такой результат: 0x57364794
Любое решение?

4b9b3361

Ответ 1

Попробуйте это, он работает для меня

string clientMachineName;
clientMachineName = (Dns.GetHostEntry(Request.ServerVariables["remote_addr"]).HostName);
Response.Write(clientMachineName);

Ответ 2

Названия машин - это концепция только для локальных сетей, а также локальные сети/леса AD. После того, как вы выставите свой сайт на интернет-машинах, имена больше не имеют смысла, вместо этого вы получаете имена DNS.

Итак, например, на моей рабочей сети имя моего ноутбука разрешено для bdorrans01.redmond.contoso.com. Но если я перейду на веб-сайт из дома, мой текущий IP-адрес разрешит c-98-203-143-14.hsd1.wa.comcast.net.

Вы выполняете полное доменное имя и отбрасываете все после первого периода/полной остановки. Это работает в среде AD (вроде), и ваш код будет видеть bdorrans01 внутренне, но он будет видеть c-98-203-143-14 извне.

Даже внутри объекта с несколькими лесами AD также было бы неправильно, если бы ваш веб-сайт размещался в другом лесу, например, если вы проживали на сайте example.europe.contoso.com, ваш код получит машинное имя bdorrans01, но моя машина не была бы в том же лесу, и если бы вы попытались ее прогнать или отобразить на сетевой диск, она не будет найдена, потому что вы будете искать bdorrans01 в europe.contoso.com, а не в redmond.contoso.com, где это на самом деле.

Также ваш код предполагает, что при разрешении IP-адреса будет создано полное доменное имя, во многих случаях это неверно, вы можете просто вернуть IP-адрес, чтобы вы могли видеть 1.2.3.4 и ваш код дал бы машинное имя 1. Хуже того, он ничего не сделает с адресом IPv6, поскольку они используют двоеточия для разделения, 2001: db8: 85a3: 8d3: 1319: 8a2e: 370: 7348

Итак, ваша предпосылка неверна - и вам нужно найти другой способ сделать то, что вы пытаетесь сделать. Почему вы считаете, что вам все равно нужно имя машины?

Ответ 3

Поскольку @blowdark написал, что невозможно получить имя машинного компьютера, а имя хоста не является именем клиентской машины. Посмотрите, что из запроса вы можете иметь?

  • Запрос IP-адреса (TCP/IP)
  • Заголовки HTTP

Это все. IP-адрес - это IP-адрес, который предоставляется вашим интернет-провайдером, а имя хоста - это имя какой-либо машины-поставщика, через которую проходит Интернет-трафик. Вы даже не можете получить простой способ локального IP-адреса пользователя в сети интернет-провайдера.

Если ваше приложение имеет балансировщик нагрузки или прокси-сервер, вам нужно прочитать заголовок HTTP_X_FORWARDED_FOR (по умолчанию), чтобы получить запрос клиента IP. Но это IP-адрес провайдера снова.

Итак, из запроса IP вы не можете получить имя реального клиентского компьютера в целом. В HTTP-заголовках браузеры также не передают имя машины. Возможно, с помощью каких-то хаков вы можете получить имя машины, запрашивающую сервер провайдера, но это вне сферы действия.

Ответ 4

Как только вы включите браузер, чтобы разрешить создание объектов active-x, для IE вы можете написать ниже код javascript, чтобы получить имя компьютера клиента как:

var WinNetwork = new ActiveXObject("WScript.Network");
var ComputerName = WinNetwork.ComputerName;