Как определить, связана ли машина с доменом (на C #)?

Как определить, подключен ли компьютер к домену Active Directory (в режиме рабочей группы)?

Вы можете использовать PInvoke для API Win32, например 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 } } 

Не дурачийтесь с pinvoke, если вам это не нужно.

Reference System.DirectoryServices, затем вызовите:

 System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain() 

ActiveDirectoryObjectNotFoundException если машина не ActiveDirectoryObjectNotFoundException к домену. Возвращаемый объект Domain содержит свойство Name, которое вы ищете.

Также можно вызвать с помощью system.net

 string domain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName 

Если строка домена пуста, машина не связана.

 ManagementObject cs; using(cs = new ManagementObject("Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'" )) { cs.Get(); Console.WriteLine("{0}",cs["domain"].ToString()); } 

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

Обязательно обращайтесь к System.Management

Просто хотел отказаться от кода Роба в VB:

  Public Class Test Public Function IsInDomain() As Boolean Try Dim status As Win32.NetJoinStatus = Win32.NetJoinStatus.NetSetupUnknownStatus Dim pDomain As IntPtr = IntPtr.Zero Dim result As Integer = Win32.NetGetJoinInformation(Nothing, pDomain, status) If (pDomain <> IntPtr.Zero) Then Win32.NetApiBufferFree(pDomain) End If If (result = Win32.ErrorSuccess) Then If (status = Win32.NetJoinStatus.NetSetupDomainName) Then Return True Else Return False End If Else Throw New Exception("Domain Info Get Failed") End If Catch ex As Exception Return False End Try End Function End Class Public Class Win32 Public Const ErrorSuccess As Integer = 0 Declare Auto Function NetGetJoinInformation Lib "Netapi32.dll" (ByVal server As String, ByRef IntPtr As IntPtr, ByRef status As NetJoinStatus) As Integer Declare Auto Function NetApiBufferFree Lib "Netapi32.dll" (ByVal Buffer As IntPtr) As Integer Public Enum NetJoinStatus NetSetupUnknownStatus = 0 NetSetupUnjoined NetSetupWorkgroupName NetSetupDomainName End Enum End Class 

Как и код Стефана здесь:

 Dim cs As System.Management.ManagementObject Try cs = New System.Management.ManagementObject("Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'") cs.Get() dim myDomain as string = = cs("domain").ToString Catch ex As Exception End Try 

Я считаю, что только второй код позволит вам узнать, к какой области присоединился компьютер, даже если текущий пользователь НЕ является членом домена.

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

 Environment.UserDomainName 

Ссылка MSDN для получения более подробной информации.

 Environment.GetEnvironmentVariable("USERDNSDOMAIN") 

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

Исправьте меня, если я ошибаюсь. Гигины Windows Admin – я считаю, что компьютер может находиться в нескольких доменах, поэтому может быть более важно знать, в каком домене, если таковые имеются, вместо того, чтобы быть в любом домене.

Вы можете проверить свойство PartOfDomain classа Win32_ComputerSystem WMI. MSDN говорит:

PartOfDomain

Тип данных: boolean

Тип доступа: только для чтения

Если True, компьютер является частью домена. Если значение NULL, компьютер не находится в домене или статус неизвестен. Если вы отсоедините компьютер от домена, значение станет ложным.

 ///  /// Determines whether the local machine is a member of a domain. ///  /// A boolean value that indicated whether the local machine is a member of a domain. /// http://msdn.microsoft.com/en-us/library/windows/desktop/aa394102%28v=vs.85%29.aspx public bool IsDomainMember() { ManagementObject ComputerSystem; using (ComputerSystem = new ManagementObject(String.Format("Win32_ComputerSystem.Name='{0}'", Environment.MachineName))) { ComputerSystem.Get(); object Result = ComputerSystem["PartOfDomain"]; return (Result != null && (bool)Result); } } 

Вот мои методы с обработкой исключений / комментариями, которые я разработал на основе нескольких ответов в этом сообщении.

  1. Получает домен, к которому подключен компьютер.
  2. Возвращает только имя домена, если пользователь действительно зарегистрирован в учетной записи домена.

     ///  /// Returns the domain of the logged in user. /// Therefore, if computer is joined to a domain but user is logged in on local account. String.Empty will be returned. /// Relavant StackOverflow Post: http://stackoverflow.com/questions/926227/how-to-detect-if-machine-is-joined-to-domain-in-c ///  ///  /// Domain name if user is connected to a domain, String.Empty if not. static string GetUserDomainName() { string domain = String.Empty; try { domain = Environment.UserDomainName; string machineName = Environment.MachineName; if (machineName.Equals(domain,StringComparison.OrdinalIgnoreCase)) { domain = String.Empty; } } catch { // Handle exception if desired, otherwise returns null } return domain; } ///  /// Returns the Domain which the computer is joined to. Note: if user is logged in as local account the domain of computer is still returned! ///  ///  /// A string with the domain name if it's joined. String.Empty if it isn't. static string GetComputerDomainName() { string domain = String.Empty; try { domain = System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name; } catch { // Handle exception here if desired. } return domain; } 

Если производительность имеет значение, используйте функцию GetComputerNameEx :

  bool IsComputerInDomain() { uint domainNameCapacity = 512; var domainName = new StringBuilder((int)domainNameCapacity); GetComputerNameEx(COMPUTER_NAME_FORMAT.ComputerNameDnsDomain, domainName, ref domainNameCapacity); return domainName.Length > 0; } [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern bool GetComputerNameEx( COMPUTER_NAME_FORMAT NameType, StringBuilder lpBuffer, ref uint lpnSize); enum COMPUTER_NAME_FORMAT { ComputerNameNetBIOS, ComputerNameDnsHostname, ComputerNameDnsDomain, ComputerNameDnsFullyQualified, ComputerNamePhysicalNetBIOS, ComputerNamePhysicalDnsHostname, ComputerNamePhysicalDnsDomain, ComputerNamePhysicalDnsFullyQualified } 

Возможно, вы захотите попробовать использовать поле DomainRole WMI. Значения 0 и 2 показывают автономную рабочую станцию ​​и автономный сервер соответственно.

Мы используем это для XIA Configuration для нашего программного обеспечения для сетевого аудита, поэтому я тут же подкрепил метод …

 ///  /// Determines whether the local machine is a member of a domain. ///  /// A boolean value that indicated whether the local machine is a member of a domain. /// http://msdn.microsoft.com/en-gb/library/windows/desktop/aa394102(v=vs.85).aspx public bool IsDomainMember() { ManagementObject ComputerSystem; using (ComputerSystem = new ManagementObject(String.Format("Win32_ComputerSystem.Name='{0}'", Environment.MachineName))) { ComputerSystem.Get(); UInt16 DomainRole = (UInt16)ComputerSystem["DomainRole"]; return (DomainRole != 0 & DomainRole != 2); } } 

Вы можете проверить использование WMI :

 private bool PartOfDomain() { ManagementObject manObject = new ManagementObject(string.Format("Win32_ComputerSystem.Name='{0}'", Environment.MachineName)); return (bool)manObject["PartOfDomain"]; } 

Предлагаемое решение выше возвращает false на машине домена, если локальный пользователь зарегистрирован.

Самый надежный метод, который я нашел, – через WMI:

http://msdn.microsoft.com/en-us/library/aa394102(v=vs.85).aspx (см. domainrole)

  • ComboBox.SelectedText не дает мне SelectedText
  • Альтернативные streamи данных NTFS - .NET
  • Что здесь происходит в функции pow?
  • Проблема с преобразованием int в строку в Linq для объектов
  • Включение VLA (массивы переменной длины) в MS Visual C ++?
  • Процесс приостановки в C #
  • Как обновить пользовательский интерфейс из другого streamа, запущенного в другом classе
  • Возможно ли получить доступ к полям поддержки за автоматически реализованными свойствами?
  • asp.net mvc: как перенаправить не www на www и наоборот
  • Разбор JSON с использованием C
  • Отключить / включить звук, изменить мастер-громкость в Windows 7 x64 с помощью C #
  • Interesting Posts

    Уровни фактора падения в подмножестве данных

    Драйвер сенсорной панели Synaptics не может помешать сенсорной панели «постучать = щелкнуть»,

    Как выполнить запланированную задачу с помощью «schtasks» без открытия нового окна командной строки?

    Как использовать пиво Python в качестве Python по умолчанию?

    добавить / удалить имя привязки из текущего URL без обновления

    Double-Checked Lock Singleton в C ++ 11

    Отключить предупреждение о расширении файла изменений в Windows 7

    Как просмотреть SQL, созданный платформой Entity Framework?

    SELECT * FROM из нескольких таблиц. MySQL

    Как обнаружить Android Tablets в целом. UserAgent?

    Регулярное выражение с переменным числом групп?

    Почему эмулятор Android настолько медленный? Как мы можем ускорить разработку эмулятора Android?

    Будет ли зеркалирование с SSD улучшать производительность чтения?

    Фрагмент или fragment поддержки?

    AddEventHandler с использованием отражения

    Давайте будем гением компьютера.