NetGetJoinInformation (netapi32)
Last changed: -198.76.24.139

.
Summary
The NetGetJoinInformation function retrieves join status information for the specified computer.

C# Signature:

[DllImport("Netapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
static extern int NetGetJoinInformation(
  [In,MarshalAs(UnmanagedType.LPWStr)] string server,
  out IntPtr domain,
  out NetJoinStatus status);

VB Signature:

Declare Function NetGetJoinInformation Lib "netapi32.dll" (TODO) As TODO

User-Defined Types:

// Win32 Result Code Constant
const int ErrorSuccess = 0;

// NetGetJoinInformation() Enumeration
public enum NetJoinStatus
{
    NetSetupUnknownStatus = 0,
    NetSetupUnjoined,
    NetSetupWorkgroupName,
    NetSetupDomainName
} // NETSETUP_JOIN_STATUS

Alternative Managed API:

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain();

However, this throws an exception (undocumented) on some PC's ("Logon failure") which pretty much renders it useless. Bummer.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

[DllImport("Netapi32.dll")]
static extern int NetApiBufferFree(IntPtr Buffer);

// Returns the domain name the computer is joined to, or "" if not joined.
public static string GetJoinedDomain()
{
    int result = 0;
    string domain = null;
    IntPtr pDomain = IntPtr.Zero;
    NetJoinStatus status = NetJoinStatus.NetSetupUnknownStatus;
    try
    {
        result = NetGetJoinInformation(null, out pDomain, out status);
        if (result == ErrorSuccess &&
            status == NetJoinStatus.NetSetupDomainName)
        {
            domain = Marshal.PtrToStringUni(pDomain);
        }
    }
    finally
    {
        if (pDomain != IntPtr.Zero) NetApiBufferFree(pDomain);
    }
    if (domain == null) domain = "";
    return domain;
}

Documentation