如何检测我的程序是否在Active Directory环境中运行?

时间:2020-03-06 14:47:39  来源:igfitidea点击:

如何检测我的程序是否在Active Directory环境中运行?

我正在使用Cand .Net 2.0

解决方案

一种方法是查询LOGONSERVER环境变量。这将为我们提供AD控制器的服务器名称...据我所知,如果当前未登录到域,则它将为空白(或者与当前工作站匹配?不确定)。

用法示例:

string ADServer = Environment.GetEnvironmentVariable("LOGONSERVER");

尝试获取Environment.UserDomainName并将其与Environment.MachineName进行比较。如果两者相同,则用户可能没有域。如果它们不相同,则用户将登录到必须具有目录服务器的域中。

来自http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry.path.aspx

To bind to the current domain using LDAP, use the path "LDAP://RootDSE", then get the default naming context and rebind the entry.

因此,在没有域的情况下,对" LDAP:// RootDSE"的绑定将失败或者不返回任何内容。我没有亲自尝试过。

use System.DirectoryServices; // add reference to system.directoryservices.dll

...

DirectoryEntry ent = new DirectoryEntry("LDAP://RootDSE");
String str = ent.Properties["defaultNamingContext"][0];
DirectoryEntry domain = new DirectoryEntry("LDAP://" + str);

与依赖于环境变量(用户可以删除或者添加到欺骗程序的环境变量)相比,这绝对是检查Active Directory的一种更干净的方法。

此代码将检查计算机本身是否是域的成员

using System.DirectoryServices.ActiveDirectory;

bool isDomain = false;

try
{
    Domain.GetComputerDomain();
    isDomain = true;
}
catch (ActiveDirectoryObjectNotFoundException)
{
}

但是,计算机可以在域中,但是当前登录的用户可以是本地用户帐户。如果你想检查这个,使用Domain.GetCurrentDomain()函数

我发现了一些可行的方法:

使用System.Net.NetworkInformation;

IPGlobalProperties.GetIPGlobalProperties()。DomainName;

与本地用户和域用户一起使用。