Как обнаружить, если машина соединена с доменом?

Как я обнаруживаю, соединена ли машина с доменом Active Directory (по сравнению с в режиме Workgroup)?

56
задан Tim Cooper 24 July 2019 в 18:56
поделиться

3 ответа

Вы можете использовать PInvoke для Win32 API, например NetGetDcName , который вернет пустую / пустую строку для машины, не присоединенной к домену.

Еще лучше NetGetJoinInformation , который точно скажет вам, если машина не подключена, в рабочей группе или в домене.

Используя NetGetJoinInformation Я собрал это, что сработало для меня:

public class Test
{
    public static bool IsInDomain()
    {
        Win32.NetJoinStatus status = Win32.NetJoinStatus.NetSetupUnknownStatus;
        IntPtr pDomain = IntPtr.Zero;
        int result = Win32.NetGetJoinInformation(null, out pDomain, out status);
        if (pDomain != IntPtr.Zero)
        {
            Win32.NetApiBufferFree(pDomain);
        }
        if (result == Win32.ErrorSuccess)
        {
            return status == Win32.NetJoinStatus.NetSetupDomainName;
        }
        else
        {
            throw new Exception("Domain Info Get Failed", new Win32Exception());
        }
    }
}

internal class Win32
{
    public const int ErrorSuccess = 0;

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

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

    public enum NetJoinStatus
    {
        NetSetupUnknownStatus = 0,
        NetSetupUnjoined,
        NetSetupWorkgroupName,
        NetSetupDomainName
    }

}
28
ответ дан 26 November 2019 в 17:04
поделиться
ManagementObject cs;
        using(cs = new ManagementObject("Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'" ))
        {
            cs.Get();
            Console.WriteLine("{0}",cs["domain"].ToString());
        }

Это должно позволить вам получить домен. Я считаю, что он будет пустым или пустым, если вы являетесь частью рабочей группы, а не доменом.

Не забудьте указать System.Management

7
ответ дан 26 November 2019 в 17:04
поделиться

Переменные среды могут работать на вас.

Environment.UserDomainName

Ссылка MSDN для получения дополнительных сведений.

Environment.GetEnvironmentVariable("USERDNSDOMAIN")

Я не уверен, что эта переменная среды существует, не будучи в домене.

Поправьте меня, если я ошибаюсь, фанаты администраторов Windows - я считаю, что компьютер может находиться в нескольких доменах, поэтому может быть важнее знать, в каком домене, если таковой имеется, вы находитесь, а не в any домен.

4
ответ дан 26 November 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: