Если у вас есть такой массив
data = array ([0] = & gt; array ([subject] = & gt; a [object] = & gt; c), [1 ] = & gt; array ([subject] = & gt; b [object] = & gt; d), [2] = & gt; array ([subject] = & gt; d [object] = & gt; b), [3] = & gt; массив ([subject] = & gt; d [object] = & gt; c), [4] = & gt; array ([subject] = & gt; c [object] = & gt; a), [5] = & gt; array [[subject] = & gt; c [object] = & gt; d))
, и вы хотите получить такие массивы:
data = array ([0] = & gt; array ([subject] = & gt; a [object] = & gt; c), [1] = & gt; array ([subject] = & gt; b [object] = & gt; d), [2] = & gt; array ([subject] = & gt; d [object] = & gt; c))
или
data = array ( [0] = & gt; array ([subject] = & gt; d [object] = & gt; b), [1] = & gt; array ([subject] = & gt; c [object] = & gt; a), [2 ] = & gt; ([subject] = & gt; c [object] = & gt; d))
следующий код может помочь
$ data1 = array (); $ data1 = $ data; for ($ q = 0; $ q & lt; count ($ data); $ q ++) {for ($ p = 0; $ p & lt; count ($ data1); $ p ++) {if (($ data [$ q] [ "subject"] == $ data1 [$ p] ["object"]) & amp; & amp; ($ data [$ q] ["object"] == $ data1 [$ p] ["subject"])) { $ data1 [$ p] ["subject"] = $ data [$ q] ["subject"]; $ data1 [$ p] ["object"] = $ data [$ q] ["object"]; }}} $ data1 = array_values (array_map ("unserialize", array_unique (array_map ("serialize", $ data1)))); $ data = $ data1;
Вы можете использовать PInvoke для API Win32, например NetGetDcName , который вернет пустую / пустую строку для машины, не связанной с доменом.
Предлагаемое решение выше возвращает false на машине домена, если локальный пользователь зарегистрирован.
Самый надежный метод, который я нашел, - через WMI:
http : //msdn.microsoft.com/en-us/library/aa394102 (v = vs.85) .aspx (см. domainrole)
Если производительность имеет значение, используйте функцию GetComputerNameEx :
bool IsComputerInDomain () {uint domainNameCapacity = 512; var domainName = new StringBuilder ((int) domainNameCapacity); GetComputerNameEx (COMPUTER_NAME_FORMAT.ComputerNameDnsDomain, domainName, ref domainNameCapacity); return domainName.Length & gt; 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}
Переменные среды могут работать для вас.
Environment.UserDomainName
Ссылка MSDN для получения более подробной информации. [ ! d5]
Environment.GetEnvironmentVariable ("USERDNSDOMAIN")
Я не уверен, что эта переменная среды существует, не находясь в домене.
Исправьте меня, если я ошибаюсь. Гитаристы Windows Admin - я считаю, что компьютер может быть в нескольких доменах, поэтому может быть более важно знать, в каком домене вы находитесь, а не в , любом домен.
Вот мои методы с обработкой / комментариями исключений, которые я разработал на основе нескольких ответов в этом сообщении.
/// & lt; summary & gt; /// Возвращает домен зарегистрированного пользователя. /// Поэтому, если компьютер подключен к домену, но пользователь входит в локальную учетную запись. String.Empty будет возвращен. /// Relavant StackOverflow Post: http://stackoverflow.com/questions/926227/how-to-detect-if-machine-is-joined-to-domain-in-c /// & lt; / summary & gt; /// & lt; seealso cref = "GetComputerDomainName" / & gt; /// & lt; возвращает & gt; Доменное имя, если пользователь подключен к домену, String.Empty, если нет. & lt; / returns & gt; static string GetUserDomainName () {строка domain = String.Empty; try {domain = Environment.UserDomainName; string machineName = Environment.MachineName; if (machineName.Equals (домен, StringComparison.OrdinalIgnoreCase)) {domain = String.Empty; }} catch {// обрабатывать исключение, если требуется, в противном случае возвращает null} return domain; } /// & lt; summary & gt; /// Возвращает домен, к которому подключен компьютер. Примечание: если пользователь зарегистрирован как локальная учетная запись, домен компьютера все еще возвращается! /// & lt; / summary & gt; /// & lt; seealso cref = "GetUserDomainName" / & gt; /// & lt; returns & gt; Строка с именем домена, если она соединена. String.Empty, если это не так. & Lt; / returns & gt; static string GetComputerDomainName () {строка domain = String.Empty; try {domain = System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain (). Имя; } catch {// При необходимости обработать исключение. } return domain; }
Может также вызываться с помощью system.net
string domain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties (). DomainName
Если строка домена пуста, машина не связана.
Не обманывайте pinvoke, если вам это не нужно.
Reference System.DirectoryServices, а затем вызывается:
System.DirectoryServices.ActiveDirectory.Domain. GetComputerDomain ()
Выбрасывает ActiveDirectoryObjectNotFoundException
, если машина не подключена к домену. Возвращаемый объект Domain содержит свойство Name, которое вы ищете.
Возможно, вы захотите попробовать использовать поле DomainRole WMI. Значения 0 и 2 показывают автономную рабочую станцию и автономный сервер соответственно.
Мы используем это для XIA Configuration для нашего программного обеспечения для сетевого аудита, поэтому я тут же подкрепил метод ...
/// & lt; summary & gt; /// Определяет, является ли локальная машина членом домена. /// & lt; / summary & gt; /// & lt; возвращает & gt; Булево значение, указывающее, является ли локальная машина членом домена. & lt; / returns & gt; /// & lt; примечания & gt; http: //msdn.microsoft.com/en-gb/library/windows/desktop/aa394102 (v = vs.85) .aspx & lt; / remarks & gt; 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 & amp; DomainRole! = 2); }}
Вы можете проверить с помощью WMI:
private bool PartOfDomain () {ManagementObject manObject = new ManagementObject (string.Format ("Win32_ComputerSystem.Name = '{0}'", Environment.MachineName )); return (bool) manObject ["PartOfDomain"]; }
Вы можете проверить свойство PartOfDomain класса WMI Win32_ComputerSystem. [D0] MSDN говорит:
PartOfDomain
Тип данных: boolean
Тип доступа: только для чтения
Если True, компьютер является частью домена. Если значение NULL, компьютер не находится в домене или статус неизвестен. Если вы отсоедините компьютер от домена, значение станет false.
blockquote>/// & lt; summary & gt; /// Определяет, является ли локальная машина членом домена. /// & lt; / summary & gt; /// & lt; возвращает & gt; Булево значение, указывающее, является ли локальная машина членом домена. & lt; / returns & gt; /// & lt; примечания & gt; http: //msdn.microsoft.com/en-us/library/windows/desktop/aa394102%28v=vs.85%29.aspx< / замечания & gt; public bool IsDomainMember () {ManagementObject ComputerSystem; using (ComputerSystem = new ManagementObject (String.Format ("Win32_ComputerSystem.Name = '{0}'", Environment.MachineName))) {ComputerSystem.Get (); object Result = ComputerSystem ["PartOfDomain"]; return (Результат! = null & amp; & amp; (bool) Результат); }}
Просто хотел отбросить код Роба в VB:
Открытый класс Test Public Function IsInDomain () As Boolean Попробовать состояние Dim Как Win32.NetJoinStatus = Win32.NetJoinStatus.NetSetupUnknownStatus Dim pDomain As IntPtr = IntPtr.Zero Dim result As Integer = Win32.NetGetJoinInformation (Nothing, pDomain, status) Если (pDomain & lt; gt; IntPtr.Zero) Затем Win32.NetApiBufferFree (pDomain) End If If (result = Win32.ErrorSuccess) Затем If (status = Win32.NetJoinStatus.NetSetupDomainName) Затем верните True Else Return False End If Else Throw New Exception («Ошибка получения информации о домене») End If Catch ex As Exception Return False End Try End Function End Class Открытый класс Win32 Public Const ErrorSuccess As Integer = 0 Объявить автоматическую функцию NetGetJoinInformation Lib «Netapi32.dll» (ByVal server As String, ByRef IntPtr As IntPtr, ByRef status As NetJoinStatus) Как целое объявляет автоматическую функцию NetApiBufferFree Lib «Netapi32.dll» (ByVal Buffer As IntPtr) Как Integer Public Enum NetJoinStatus NetSetupUnknownStatus = 0 NetSetupUnjoined NetSetupWorkgroupName NetSetupDomainName End Enum End Class
Также как и код Стефана здесь:
Dim cs As System.Management.ManagementObject Попробуйте cs = Новая система .Management.ManagementObject ("Win32_ComputerSystem.Name = '" + System.Environment.MachineName + "'") cs.Get () dim myDomain как string = = cs ("domain"). ToString Catch ex As Exception End Try
Я считаю, что только второй код позволит вам узнать, к какой области присоединился компьютер, даже если текущий пользователь НЕ является членом домена.
ManagementObject cs; using (cs = new ManagementObject ("Win32_ComputerSystem.Name = '" + System.Environment.MachineName + "'")) {cs.Get (); Console.WriteLine ( "{0}", CS [ "домен"] ToString ()); }
Это должно позволить вам получить домен. Я полагаю, что это будет пустой или пустой, если вы являетесь частью рабочей группы, а не домена.
Обязательно обратитесь к System.Management
NetGetJoinInformation
возвращает устаревшее доменное имя NetBIOS, а не имя домена (следовательно, Net в NetGetJoinInformation) – Ian Boyd 20 March 2012 в 19:48выкинуть новое исключение («Доменная информация Get Failed»);
вы должны сделатьthrow new Exception («Ошибка получения информации о домене»), новый Win32Exception ());
insetad. ВнутреннийWin32Exception
будет внутренне вызыватьMarshal.GetLastWin32Error ()
и установить код ошибки и сообщение об ошибке для этого кода во внутреннем исключении. Вот почему вы делаетеSetLastError = true
в подписи p / invoke, так чтоMarshal.GetLastWin32Error ()
будет работать. – Scott Chamberlain 17 February 2017 в 22:06