Zuordnung von Windows Benutzern und SIDs über Windows Registry oder per WMI

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ThomasG82.

    Zuordnung von Windows Benutzern und SIDs über Windows Registry oder per WMI

    Moin,

    ich stehe grade extrem auf dem Schlauch.

    Das Problem in kurz: Zuordnen der Windows Benutzernamen (Anzeigename) und der entsprechenden SID

    In länger: ich lese alle SIDs der Windows Benutzer aus der Windows Registry aus (das klappt ja)

    VB.NET-Quellcode

    1. 'Auslesen der Namen der Unterschlüssel (hier die SIDs)
    2. SubKey = BaseKey.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", False)
    3. SubKeyAufzählung = SubKey.GetSubKeyNames()

    später lese ich sie in eine ListBox ein und filtere noch automatisch die systemeigenen Profile anhand des Fehlens des Schlüssels FullProfile aus

    VB.NET-Quellcode

    1. For ZählerVariable = 0 To SubKeyAufzählung.Length - 1
    2. SubKey = BaseKey.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" & SubKeyAufzählung(ZählerVariable).ToString, False)
    3. If SubKey.GetValue("FullProfile") IsNot Nothing Then Untermenue_sichern.LB_Nutzer.Items.Add(SubKeyAufzählung(ZählerVariable).ToString)
    4. Next


    Jetzt bin ich aber gerade zu doof mir alle unter Windows anmeldbaren Benutzer aus der Registry zu ziehen und in eine Variable einordnen zu lassen.
    Problem dabei ist ja auch, dass ich als Anhaltspunkt zum vergleichen nur das Benutzerverzeichnis habe.
    Hier ist aber das Problem, dass dort nicht unbedingt der Benutzername steht sondern nur ein Kürzel.
    Ich muss aber als Endeffekt folgendes haben:
    Benutzername == SID
    Beispiel:
    Administrator == S-1-5-21-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-1001
    Benutzer 1 == S-1-5-21-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-1002


    Über die Eingabeaufforderung und PowerShell ist das ja nur ein Befehl: wmic useraccount get name,sid

    Klar ich könnte das Ergebnis auch in eine Textdatei exportieren und dann wieder einlesen ins Programm aber das muss doch anders gehen.
    Gibt es da mal bitte einen Gedankenschubser? 8|

    Änderung : kann mir einer einen Tipp geben wie ich direkt per VB.Net auf WMI zugreifen und die Informationen abgreifen kann? Ich habe zwar ein paar Beispiele gefunden aber aus denen werde ich leider absolut nicht schlau.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThomasG82“ ()

    Hallo,
    du musst nur einen Verweis auf die System.Management.dll deinem Projekt hinzufügen - Namespace System.Management importieren nicht vergessen. Die dll stellt Objekte zum Zugriff auf WMI zur Verfügung:

    VB.NET-Quellcode

    1. Dim ms As New ManagementScope("\\.\root\cimv2")
    2. ms.Connect()
    3. Dim mos As New ManagementObjectSearcher("SELECT Name, SID FROM Win32_UserAccount")
    4. mos.Scope = ms
    5. Dim mo As ManagementObject
    6. For Each mo In mos.Get()
    7. Console.WriteLine($"SID: {mo.Properties("SID").Value} - Name: {mo.Properties("Name").Value}")
    8. Next
    Ok, danke werde ich nachher mal ausprobieren. (vmtl funktioniert das auch ich muss es nur verstehen lernen) :D

    So ich stehe wirklich auf dem Schlauch - @ISliceUrPanties könntest du mir bitte nochmal helfen. :huh:

    Der Punkt Verweis auf die System.Management.dll deinem Projekt hinzufügen - ich bekomm es nicht hin. Wo finde ich diese DLL oder suche ich einfach unter dem falschen Namen?
    Das mit dem Namespace System.Management importieren das ist mir klar und bekomm ich ja auch hin - funktioniert nur nicht solange die DLL nicht bekannt ist - was ja klar ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThomasG82“ ()

    Aber sicher:
    Die Datei findest du unter %windir%\Microsoft.NET\Framework64\v4.0.30319 (oder nur Framework, wenn du die 32bit dll möchtest). Ggf. hat dein v4-Verzeichnis eine andere Versionsnr.
    Die dll selbst kannst du über Projekt -> "Projektverweis hinzufügen" und dann im Dialog über den Button "Auswählen..." ("Browse..." - ich habe nur die englische Version von VS - unten rechts) hinzufügen.
    Danke, da ist der Fehler. Ich habe die ganze Zeit nur im NET Framework von Visual Studio gesucht und da habe ich nur v5.
    Hab nicht daran gedacht auch mal das Windows-eigene NET Framework nach der Datei zu durchsuchen. Aber danke - dein Verzeichnis war der direkte Weg ans Ziel.
    @ISliceUrPanties - ich habe gerade ein Verständnisproblem.

    Bei deinem Code hast du

    VB.NET-Quellcode

    1. Dim ms As New ManagementScope("\\.\root\cimv2")
    2. ms.Connect()
    angegeben.

    Wofür steht hier die Verzeichnisangabe "\\.\root\cimv2"? Für mich hört sich das ja nach einem Linux/Unix Basisbefehl an um in ein Hauptverzeichnis zu kommen.
    Ich habe leider auch noch keine vernünftige Erklärung für ManagementScope gefunden und werde auch aus den Einträgen in der DLL nicht so wirklich schlau.
    Kannst du mir da eine kurze Erklärung geben?

    OK - es geht um das Basisverzeichnis des PCs auf dem der Befehl aufgerufen wird.
    Ich erhalte aber immer folgenden Fehler - siehe Anhang
    Bilder
    • Fehlermeldung.png

      30,9 kB, 704×564, 44 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThomasG82“ ()

    Die Zeichenfolge im Konstruktor von ManagementScope wird als Managementpfad bezeichnet. Dabei steht \\. für den lokalen Computer (du kannst auch einen Computernamen anstelle des . angeben, wenn du z.B. auf einen Computer in deinem Netzwerk zugreifen möchtest), root für das Management-Root und cimv2 für Common Information Model (v2). Das CIM ist eine standardisierte Schnittstelle, mit der sich die meisten Dinge über einen Computer abfragen lassen. Mehr kannst du hier nachlesen docs.microsoft.com/en-us/windows/win32/wmisdk/about-wmi
    Wo und wann tritt dieser Fehler bei dir auf? Nur mit der Meldung kann man nichts anfangen. Komisch ist, dass der Fehler bei dir in einer .NET Core Framework dll auftritt.
    ja ich fummel gerade. Es scheint daran zu liegen, dass ich als Ziel-Framework NET v5 angegeben habe. Dort gibt es die Klasse ja nicht. Allerdings lässt sich kein NET Framework nachträglich hinzufügen. Mal schauen vielleicht klappt es ja noch sonst muss ich VS nochmal neu installieren.
    Das hat nichts mit VS zu tun, sondern in der konfigurierten Zielplatform für deine Anwendung. Ist das jetzt .NET 4.x oder 5? Man sollte schon darauf achten, dass man hier die korrekte Version angibt. :)
    Für .NET 5 findest du hier nuget.org/packages/System.Management/ ein nuget-Paket, was die Funktionalität unter .NET 5 zur Verfügung stellt.
    Ok, danke, werde ich mal ausprobieren.
    Ja ich hatte vorhin drauf rum gedacht und war ja auch auf den Punkt gekommen, dass ich schlecht v5 nehmen kann aber v4 Funktionalität haben will.
    Was mich nur wundert ist, dass ich v4 in VS installiert habe und es als Ziel Framework nicht angeben kann.
    Außerdem sollte es ja trotzdem funktionieren denn ich binde die DLL ja von Hand ein, gebe sie mit, lege sie dem Build Ordner bei und im Code kann er mit System.Management auch etwas anfangen und damit arbeiten. Nur halt an der Stelle, an dem er sich mit dem PC und dann mit dem Dienst verbinden soll verweigert er den Dienst.
    Ich habe auch die Anleitung hoch und runter gelesen und selbst den Probe Code von DocNET genutzt aber er will partout nicht.
    @ISliceUrPanties - ich muss mich entschuldigen für all den Stress hier. :/
    Wenn man ordentlich aufpasst, wenn man sein Projekt startet, dann fällt einem auf, dass man die ganze Zeit eine .NET Core Version entwickelt und nicht .NET Framework.
    Deshalb war auch die Einbindung von System.Management nur über die DLL möglich. *dummdummdumm*

    Ich habe jetzt nochmal auf .NET Framework das ganze neu gestartet und werde schauen, dass ich die .NET Core Version nebenbei weiterführe. Leider kann man ja nicht alles einfach 1zu1 kopieren da ja .NET Core bekanntlich frei von Altlasten ist (was im Prinzip ja nur zu begrüßen ist) aber leider dafür verlangt, dass man sehr sehr sehr genau weiß was man will und wo man es findet. Und wenn ich die Formulare von einem Prokelt ins andere kopiere kommen in Massen Fehlermeldungen.

    Nun ja - selber Schuld. Somit kann ich auch als Ziel-Framework .NET v4.6 angeben und habe keinerlei Probleme. Also grundsätzlich läuft es jetzt erstmal und ich danke dir für die Hilfe. Deinen Link mit dem nuget-Packet werde ich dann trotzdem mal probieren und vielleicht bekomm ich es dann ja ordentlich zum laufen.

    *SchandeÜberMeinHaupt* :whistling:

    So viel Fummelei später - es klappt. Ich danke dir. :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThomasG82“ ()