.NET中机器的域名是什么?

31

肯定有一种简单的方法可以做到这一点,我不敢相信没有。我已经浏览了网络并找到了大约20种不同的方法来查找当前用户所在的域,但没有一种方法可以获取当前计算机的域(或工作组)。

在未管理的c++中,可以通过以下方式检索:

WKSTA_INFO_100 *buf;
NetWkstaGetInfo(NULL, 100, (LPBYTE*)buf);
domain_name = pBuf->wki100_langroup;

有人能帮我吗?是否有一种方法可以在托管的C#中获得相同的信息?

编辑1:朋友们,请仔细阅读问题。我不是在寻找用户域名。


提示:.NET Core目前还没有明显的获取此信息的方法。我最终使用了P/Invoke NetWkstaGetInfo(这个问题让我很容易找到)。 - Joshua
6个回答

43

如果机器不在域中,我们将会得到一个异常。 - Shrike
@shrike - 是的,在引用它的属性之前,您可能确实想检查域是否为null。但这会使答案变得有点凌乱。 - tvanfosson
6
Domain.GetCurrentDomain不会返回null,而是抛出ActiveDirectoryOperationException异常(“当前安全上下文未与Active Directory域或林关联”)。 Domain.GetComputerDomain()也是如此(这个更好用)。但后者会抛出不同的异常。无论如何,使用Domain的方法并不安全。更安全的方式是使用NetGetJoinInformation API(由@David提到)。 - Shrike
1
@Shrike -- 只要你知道它可能会抛出异常,那就不是问题。你只需要捕获它并做出适当的反应。如果你正在使用.NET,我认为最好使用DirectoryServices中的托管API。我从未实际使用过这种方法,但该命名空间提供了一些非常好的抽象。 - tvanfosson
根据 .Net 4+ 中的智能感知,Domain.GetCurrentDomain() 获取当前应用程序正在运行的安全上下文下生效的当前用户凭据的域对象。要获取计算机所属的域,请使用 Domain.GetComputerDomain()。编辑:刚刚看到下面 @Aleksandr 的回复,说的是同样的事情。 - Redeemed1

15

我在一个项目上工作,用户可以在任何地方; 在域机器上的非域用户,在非域机器上的用户,在第三方网络上没有直接连接到域等,所以依赖于AD已经是行不通的。

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName 在所有这些情况下都更可靠。

http://blogs.msdn.com/b/trobbins/archive/2006/01/04/509347.aspx

https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.domainname(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2

Imports System.DirectoryServices
Imports System.Net.NetworkInformation

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            MsgBox("Domain: " & ActiveDirectory.Domain.GetComputerDomain.Name)
        Catch ex As Exception
            MsgBox(ex.GetType.ToString & ": " & ex.Message)
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Try
            MsgBox("Domain: " & IPGlobalProperties.GetIPGlobalProperties().DomainName)
        Catch ex As Exception
            MsgBox(ex.GetType.ToString & ": " & ex.Message)
        End Try
    End Sub

End Class

你刚刚救了我的命,谢谢 :-) 如果可以的话我会给你+18分。 - InteXX
1
如果计算机已从域中移除,则IPGlobalProperties.GetIPGlobalProperties().DomainName将失败。然后它会返回旧值。 - AnthonyVO

7

使用 GetCurrentDomain Environment.UserDomainName 是相同的,但如果您的程序在域计算机上以非域用户身份运行,则可能会导致不正确的结果。以下是我使用的代码:

try
{
    return System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name;
}
catch (Exception)
{
    return Environment.UserDomainName;
}

5

System.Environment.UserDomainName


我正在使用IIS运行一个.NET应用程序,这对我有效。 - srmark
6
这并不正确。用户域名不一定与机器名相同。在我的工作场所,开发机器位于子域中。 - Simon MᶜKenzie
如果运行您的网站的机器是位于反向代理后面的服务器群中,则这也不正确。 - SWalters

2
如果您不想添加对System.DirectoryServices的依赖,您也可以直接调用NetGetJoinInformation API。该API的详细信息请参阅此处

2
NetGetJoinInformation 返回域的传统 NetBIOS 名称。 - Ian Boyd

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接