如何检测我的程序是否在活动目录环境中运行

本文关键字:活动 环境 运行 是否 程序 何检测 检测 我的 | 更新日期: 2023-09-27 17:47:21

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

我正在使用 C# 和 .Net 2.0

如何检测我的程序是否在活动目录环境中运行

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

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

using System.DirectoryServices.ActiveDirectory;

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

但是,计算机可以位于域中,但当前登录的用户可能是本地用户帐户。如果要检查这一点,请使用Domain.GetCurrentDomain()功能

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

示例用法:

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

我发现了一些有用的东西:

使用System.Net.NetworkInformation;

IPGlobalProperties.GetIPGlobalProperties().域名;

适用于本地用户和域用户。

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

要使用 LDAP 绑定到当前域,请使用路径"LDAP://RootDSE",然后获取默认命名上下文并重新绑定条目。

因此,如果没有域,与"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);

这绝对是检查活动目录的更干净方法,而不是依赖环境变量(用户可以删除或添加环境变量来欺骗程序)。