Mit .NET Active directory Benutzer auslesen

ALMAAAAA

Cadet 2nd Year
Registriert
Sep. 2016
Beiträge
29
Hallo,

ich würde gerne über den PrincipalContext aus .NET alle Benutzer in meinem Active Directory abfragen. Nun bin ich leider in beiden Gebieten noch ziemlich neu und kenne mich nicht genau aus. Ich kann mich per Remote Desktop auf den Windows-Server 2016, der in der Azure-Cloud läuft, verbinden. Jedoch scheitere ich daran die Verbindung mit dem PrincipalContext zu realisieren. Auf dem Windows-Server sind die AD-Services, sowie einzige Benutzer definiert. Ich habe die IP-Adresse mit der ich mich Remote auf den Server verbinden kann, sowie einen Admin-User auf dem AD eingerichtet.



Im Augenblick sieht das ganze folgendermaßen aus:
using (var context = new PrincipalContext(ContextType.Domain, "Remote IP-Adresse des Servers", "CN=Users", "adminuser", "adminpasswort")

Ich habe auf dem Azure-Server testhalber alle Ports freigegeben, damit dort nichts blockiert wird. Jemand eine Idee wie man das ganze zum Laufen bekommt?
 
Wäre Powershell eine Möglichkeit?
Wenn du die Powershell ISE aufrufst, kannst du zb. ganz einfach Abfragen machen.

zb.
Get-ADUser -filter * | select samaccountname
(einfach alle user mit deren samaccountname ausgeben)

Get-ADUser USERNAME -Properties * | fl
(alle eigeneschaften des Users USERNAME ausgeben)

das Modul muss halt importiert sein dafür.
 
Das ganze muss im .NET C# funktionieren, weil es ein Teil einer anderen Applikation ist.
 
Siehe: https://docs.microsoft.com/de-de/dotnet/api/system.directoryservices?view=netframework-4.8

Als Beispiel:

C#:
using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com""))
            {
                using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
                {
                    foreach (var result in searcher.FindAll())
                    {
                        DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
                        Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
                        Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
                        Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
                        Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
                        Console.WriteLine();
                    }
                }
            }
            Console.ReadLine();
        }
    }
}
 
da_rinkes schrieb:
Siehe: https://docs.microsoft.com/de-de/dotnet/api/system.directoryservices?view=netframework-4.8

Als Beispiel:

C#:
using System;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com""))
            {
                using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
                {
                    foreach (var result in searcher.FindAll())
                    {
                        DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
                        Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
                        Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
                        Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
                        Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
                        Console.WriteLine();
                    }
                }
            }
            Console.ReadLine();
        }
    }
}

Das hatte ich auch schon probiert. Als "yourdomain.com" habe ich die IP-Adresse für die Remote-Verbindung angegeben. Ich bekomme die Exception "System.DirectoryServices.AccountManagement.PrincipalServerDownException: 'The server could not be contacted.'". Mit Remote-Desktop kann ich mich jedoch verbinden und sehe auch, dass die AD-Services dort laufen.
 
Zuletzt bearbeitet:
Ich glaube dann hast du eher ein Netzwerk-Problem oder hast einfach keine Berechtigung von deinem PC aus mit dem AD-Service zu reden.
Bist du denn im gleichen Netz-Segment wie der Server?
 
da_rinkes schrieb:
Ich glaube dann hast du eher ein Netzwerk-Problem oder hast einfach keine Berechtigung von deinem PC aus mit dem AD-Service zu reden.
Bist du denn im gleichen Netz-Segment wie der Server?

Der Windows-Server läuft in der Azure Cloud. Ich führe die Applikation auf meinem lokalen Rechner aus.
 
ALMAAAAA schrieb:
Das hatte ich auch schon probiert. Als "yourdomain.com" habe ich die IP-Adresse für die Remote-Verbindung angegeben. Ich bekomme die Exception "System.DirectoryServices.AccountManagement.PrincipalServerDownException: 'The server could not be contacted.'". Mit Remote-Desktop kann ich mich jedoch verbinden und sehe auch, dass die AD-Services dort laufen.
Dann liegt es an den Ports, welche entsprechend erreichbar/offen sein müssen. Mit der Azure Cloud kenn ich mich nicht wirklich aus, aber vielleicht hilft dir das weiter: https://docs.microsoft.com/de-de/azure/active-directory/hybrid/reference-connect-ports
 
Das wirds dann sein, du darfst (zum Glück) nicht einfach so von extern mit dem AD-Service reden.
Da musst du mit dem Admin des Netzwerks oder Servers reden und dir eine Strecke konfigurieren lassen.
Das kann z.B. ein VPN. Das hat also nichts mit .NET/C# zu tun.
 
Wenn ich in Powershell das Kommando Test-NetConnection "ip-adress remote" -Port 389 ausführe bekomme ich eine positive Antwort. Eine Verbindung besteht also eigentlich.
 
Zurück
Oben