Reputation: 18482
There gotta be an easy way to do this, I can't believe there's none. I have scanned through net and found, like, 20 different methods to find in which domain current user is, but none to get domain (or workgroup) of current machine.
In unmanaged c++ this is retrieved by:
WKSTA_INFO_100 *buf;
NetWkstaGetInfo(NULL, 100, (LPBYTE*)buf);
domain_name = pBuf->wki100_langroup;
can someone help me, if there's a way to get same info in managed C# natively?
EDIT1: Folks, please read the question. I am NOT looking for user domain name.
Upvotes: 31
Views: 35944
Reputation: 55
System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain() wraps DsGetDcName which will search the network for a domain controller even if the machine is not part of a domain. (see remarks)
As alternative to NetGetJoinInformation you could use GetComputerNameEx with the COMPUTER_NAME_FORMAT.ComputerNameDnsDomain
flag to get the full DNS domain name.
(If not part of a domain, it still returns true, but the resulting string will be empty.)
Upvotes: 1
Reputation: 334
I work on a project where users could be anywhere; non-domain users on a domain machine, users on a non-domain machine, not directly connected to the domain on a third party network, etc. so depending on AD is already a non-starter.
System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName is far more reliable under all of these conditions.
http://blogs.msdn.com/b/trobbins/archive/2006/01/04/509347.aspx
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
Upvotes: 15
Reputation: 532515
To get the current domain of the system on which your progam is running you can use System.DirectoryServices.ActiveDirectory.Domain.
Domain domain = Domain.GetComputerDomain();
Console.WriteLine( domain.Name );
Upvotes: 43
Reputation: 349
Using GetCurrentDomain is the same as Environment.UserDomainName, which works incorrectly if your program is running on a domain computer as a non-domain user. I've used the following code:
try
{
return System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name;
}
catch (Exception)
{
return Environment.UserDomainName;
}
Upvotes: 7
Reputation: 34563
If you don't want to add a dependency to System.DirectoryServices, you can also call the NetGetJoinInformation API directly.
Upvotes: 2