【问题标题】:How do I programmatically check to see what domain I am connected to?如何以编程方式检查我连接到的域?
【发布时间】:2010-11-07 16:21:17
【问题描述】:

如果我在工作中连接到本地 LAN,我需要让我的应用通过内部 IP 访问我们的服务器,否则,我需要在野外使用我们的外部 IP。

目前,我只是尝试通过本地 IP 连接,如果失败则尝试外部连接...但是超时时间有点长,我想知道是否有办法找出机器连接的域在尝试之前。

编辑:Patrick> 本质上,该应用程序在连接到本地网络的平板电脑上运行,每天几次。它通过网络连接的次数与本地连接的次数大致相等。

所有机器在连接到网络时都有一个域帐户(并且有一个命名约定类似于“LOCTabletx”的域帐户,其中 x 是机器出现幻像时的一个数字。

我正在寻找一种快速的方法来查看机器是否连接到我们的本地网络或互联网上。使用 Environment.UserDomainName 让我得到 LOCTabletx 而不是域名。

编辑

如果它对任何人有帮助,我只是尝试 DNS 解析一台我可以保证将在网络上的机器的名称(其中一台服务器)。它对我来说足够好。

【问题讨论】:

  • 您是否使用域帐户登录计算机,只是没有物理连接到您的工作网络?

标签: c# networking dns


【解决方案1】:

你试过了吗:

Environment.UserDomainName

您还可以查看机器上的活动 IP 地址,并查询在您的本地网络上工作的 IP 地址...

var x = NetworkInterface.GetAllNetworkInterfaces()
    .Where(ni => ni.OperationalStatus == OperationalStatus.Up)
    .SelectMany(ni => ni.GetIPProperties().UnicastAddresses);

// do something with the collection here to determine if you're on the right network.
// just looping & printing here for example.
foreach (var item in x)
{        
    Console.WriteLine(item.Address);
}

在你弄清楚你所在的网络之后,你可以订阅System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged 事件来在你的应用运行时处理你的计算机跳跃网络。

【讨论】:

  • 这只会让我在域中获得我的机器名称。不是域名本身。例如,如果我的 comp 是 LOCProgrammer1 并且域是 Company.Local 我得到前者,我正在寻找后者。
  • 这很奇怪。我在 Vista 和 XP Pro 下都获得了我们的域名。也许你可以用它作为你没有登录到域的指示?
  • 我得到了我的本地机器名 - 我没有登录到域。不过有道理 - 它会为您提供任何对您的登录进行身份验证的系统,如果您使用本地用户,则为本地计算机,或者如果您登录域,则为您的域。
【解决方案2】:
System.Environment.UserDomainName

【讨论】:

  • 这不起作用。即使从远程位置或没有任何互联网连接,该域也总是被填充
【解决方案3】:
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType 

这将在未连接到网络时返回“NTLM”。

【讨论】:

  • 这不起作用。没有无线网卡的电脑,没有插入网线返回Kerberos 连接与否
  • 当时(10 年前)的答案对于 OP 描述的情况是合理的。根据域配置,上面的代码可能返回了 NTLM 或 Kerberos,但我不能说。两者都是身份验证子系统,希望没有人将其域命名为“NTLM”或“Kerberose”。
【解决方案4】:

您想查看Network Location Awareness API。在 Windows Vista 或更高版本上可用,它允许您以编程方式发现您连接到哪个网络,并在更改时收到通知。

您可能熟悉“这是家庭/工作/公共网络吗?”的形式。对话框。

【讨论】:

  • 不幸的是,这些机器运行的是 WinXP Pro,但没有升级选项。不过,我会为 WinXP 做一些搜索。谢谢。
【解决方案5】:

另一种方法,但我不知道它是否实际上比其他解决方案更好:

System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType

这是一个在活动目录下返回“Kerberos”的字符串。不知道当没有连接到域时它会说什么。

【讨论】:

    【解决方案6】:

    Environment.UserDomainName ...如果您未加入域,则为您提供计算机名称。如果您加入域,它会为您提供域名。如果您将加入域的计算机从网络中取出并“进入野外”,Environment.UserDomainName 将继续提供域名,即使您重新启动并重新登录(到您的域帐户)。您的计算机会将域凭据缓存大约 30 天。

    如果您登录到您的机器帐户,那么您将获得机器名称。

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多