私のコンピューターはドメイン(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
のみを返します。
なぜWMIを使用しているのですか?標準の.NET機能を使用できませんか?
System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
タイトルでこの質問を見つけました。ドメイン名を取得する方法に関する答えを他の誰かが探している場合は、次の環境変数を使用します。
System.Environment.UserDomainName
質問の著者がこれに言及していることは承知していますが、一目見ただけでそれを逃し、他の誰かが同じことをするかもしれないと考えました。
質問の説明が求めるのは 完全修飾ドメイン名(FQDN) です。
私はこれが古いことを知っています。ドメイン名を取得するための答えを探している人のために、これをここにダンプしたかっただけです。これは、ピーターの答えと連携しています。 Richが述べたようにバグがあります。ただし、そのための簡単な回避策はいつでも作成できます。ドメインにまだ存在するかどうかを確認するには、ドメイン名にpingを実行します。応答する場合は、ドメインを必要としていたもので続行します。失敗した場合、ドロップアウトして「オフライン」モードに入ります。単純な文字列メソッド。
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";
}
}
特定のユーザーにWMIオブジェクトスペースのすべてまたは一部へのアクセスを許可する場合は、 here のように許可する必要があります。この設定を実行するには、管理者として実行する必要があることに注意してください。
protected void Page_Init(object sender, EventArgs e)
{
String hostdet = Request.ServerVariables["HTTP_Host"].ToString();
}