2009-02-03 26 views
23

Bunu yapmanın kolay bir yolu olmalı, hiçbirinin olduğuna inanamıyorum. Net üzerinden tarandım ve mevcut kullanıcının hangi alanda olduğunu bulmak için 20 farklı yöntem buldum, ancak hiçbiri geçerli makinenin etki alanını (veya çalışma grubunu) almıyor. doğal yönetilen C# aynı bilgi almak için bir yol varsa,Makinenin .NET alan adı mı?

WKSTA_INFO_100 *buf; 
NetWkstaGetInfo(NULL, 100, (LPBYTE*)buf); 
domain_name = pBuf->wki100_langroup; 

birisi bana yardımcı olabilir: yönetilmeyen c

++ bundan alınır?

EDIT1: Milletler, lütfen soruyu okuyun. Kullanıcı etki alanı adını aramıyorum.

+0

İpucu: .NET Çekirdek Henüz bu almak için herhangi bir bariz bir şekilde sahip değildir. P/Invoking NetWkstaGetInfo (bu soruyu bulmak kolay oldu) bitti. – Joshua

cevap

33

sizin Progam Eğer System.DirectoryServices.ActiveDirectory.Domain kullanabilirsiniz çalıştığı sisteminin mevcut domain almak için. Eğer System.DirectoryServices için bir bağımlılık eklemek istemiyorsanız

Domain domain = Domain.GetComputerDomain(); 
Console.WriteLine(domain.Name); 
+0

Oh, güzel! Teşekkürler, tam olarak aradığım şey bu! – galets

+0

Bir makine etki alanında değilse, bir istisna alırız. – Shrike

+0

@shrike - evet, aslında üzerinde özellik başvurmadan önce etki alanının boş olup olmadığını kontrol etmek isteyebilirsiniz. Gerçi, cevapları karıştırır. – tvanfosson

4

System.Environment.UserDomainName

+0

IIS kullanarak bir. Net uygulaması çalıştırıyorum ve bu benim için çalıştı. –

+4

Bu doğru değil. Kullanıcı alan adı mutlaka makine adıyla aynı değildir. İşyerimde, geliştirme makineleri bir alt alan içinde yer alıyor. –

+0

Bu, sitenizi çalıştıran makinenin bir ters proxy arkasındaki bir sunucu çiftliğinin parçası olması durumunda da doğru değildir. –

2

, ayrıca doğrudan NetGetJoinInformation API çağırabilirsiniz. GetCurrentDomain kullanma

+2

'NetGetJoinInformation', etki alanının eski NetBIOS adını döndürür. –

7

program dışı bir etki alanı kullanıcısı olarak etki alanı bilgisayarda çalışıyorsa yanlış çalışıyor Environment.UserDomainName, aynıdır. Aşağıdaki kodu kullanıyorum:

try 
{ 
    return System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name; 
} 
catch (Exception) 
{ 
    return Environment.UserDomainName; 
} 
10

Kullanıcıların herhangi bir yerde olabileceği bir proje üzerinde çalışıyorum; bir etki alanı makinesindeki etki alanı dışındaki kullanıcılar, etki alanı dışındaki bir makinedeki kullanıcılar, doğrudan üçüncü taraf ağındaki etki alanına bağlı değil, vb. AD'ye bağlı olarak zaten bir başlatıcı değildir.

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties() EtkiAlanıAdı tüm bu koşullar altında çok daha güvenilirdir.

http://blogs.msdn.com/b/trobbins/archive/2006/01/04/509347.aspx

https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.domainname(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2

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 
+0

Sadece gizemi kurtardın. Teşekkür ederim :-) eğer yapabilirsem. – InteXX

+1

IPGlobalProperties.GetIPGlobalProperties() Etki alanından makine çıkarılmışsa, DomainName başarısız olur. Daha sonra eski değeri döndürecektir. – AnthonyVO