Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WMI + Benutzer einer lokalen Gruppe auslesen (https://www.delphipraxis.net/144522-wmi-benutzer-einer-lokalen-gruppe-auslesen.html)

Piro 9. Dez 2009 18:19


WMI + Benutzer einer lokalen Gruppe auslesen
 
Guten Abend,

wie kann man mit WMI die Benutzer einer lokalen Gruppe bzw. der lokalen Administratoren auslesen? Das Programm wird auf dem jeweiligen Rechner ausgeführt.

Vielen Dank im voraus.

Sven

Phoenix 9. Dez 2009 18:28

Re: WMI + Benutzer einer lokalen Gruppe auslesen
 
Das entsprechende WQL-Query ist:
SQL-Code:
Select * from Win32_UserAccount where LocalAccount = True

Piro 9. Dez 2009 20:04

Re: WMI + Benutzer einer lokalen Gruppe auslesen
 
Danke schön.

Aber mit der Abfrage bekomme ich alle lokalen Benutzer. Ich müsste aber die Abfrage so gestalltem, dass ich ein Gruppe angebe und dann die Mitglieder aufgelistet werden (egal, ob Lokal oder in einer Domäne).

Funktioniert das irgendwie?

Danke im voraus.

Phoenix 9. Dez 2009 20:14

Re: WMI + Benutzer einer lokalen Gruppe auslesen
 
Die zugehörigen WMI Klassen sind
  • Win32_Account
  • Win32_UserAccount
  • Win32_Group
  • Win32_GroupUser
Entsprechend sind die Queries:
Alle Useraccounts: "select * from Win32_UserAccount where Domain='Domänenname’"
Und alle Gruppen: "select * from Win32_GroupUser where Domain='Domänenname'"

Um alle Nutzer einer Gruppe zu holen braucht man Win32_GroupUser - und da ist ein Trick dabei: Die Win32_GroupUser klasse ist einer Verknüpfung und verbindet eine Gruppe mit allen Accounts die darin sind.

Die Abfrage lautet:
SQL-Code:
select * from Win32_GroupUser where GroupComponent='"'Win32_Group.Domain='DomänenName',',Name='Gruppenname""'

Piro 9. Dez 2009 20:42

Re: WMI + Benutzer einer lokalen Gruppe auslesen
 
Genial. Hat funktioniert.

Ich mache das jetzt so.
Delphi-Quellcode:
procedure Tfrm_main.Button1Click(Sender: TObject);
var
 SWbemLocator1    : ISWbemLocator;
 aSrv            : ISWbemServices;
 vNVS            : OleVariant;
 aObjSet         : ISWbemObjectSet;
 aNVSDummy       : IDispatch;
 pEnum           : IEnumVARIANT;
 vOut            : OleVariant;
 dwRetrieved     : LongWord;
 hRes            : HResult;
 Domain, Group   : String;
begin
 Domain := GetEnvironmentVariable('COMPUTERNAME');
 Group := edt_localgroup.Text;
 memo_result.Clear;

 SWbemLocator1 := CoSWbemLocator.Create;
 aSrv := SWbemLocator1.ConnectServer(GetEnvironmentVariable('COMPUTERNAME'),'root\cimv2','','','','',0,vNVS);
 aObjSet := aSrv.ExecQuery('select * from Win32_GroupUser where GroupComponent="Win32_Group.Domain='+Chr(39)+Domain+Chr(39)+',Name='+Chr(39)+Group+Chr(39)+'"','WQL', 0, aNVSDummy);
 pEnum  := aObjSet.Get__NewEnum as IEnumVARIANT;
 while (TRUE) do
 begin
   hRes := pEnum.Next(1, vOut, dwRetrieved);
   if hRes <> S_OK then
     Break;

//    memo_result.Lines.Add(VarToStr(vOut.Name)); // funktioniert leider nicht
    memo_result.Lines.Add(VarToStr(vOut.PartComponent));
 end;
end;
Leider muss ich jetzt PartComponent nehmen, welches mir folgendes ausgibt:
Zitat:

\\<domain>\root\cimv2:Win32_UserAccount.Domain="<d omain>",Name="<benutzername>"
Gibt es noch eine einfache Methode nur den Namen auszugeben? Wenn nicht muss ich die Ausgabe zerlege, was nicht das Problem wäre aber eine einfache Methode wäre angenehm.

Danke.

RWarnecke 9. Dez 2009 21:35

Re: WMI + Benutzer einer lokalen Gruppe auslesen
 
Hi,

muss es WMI sein ? Schaue Dir mal die Unit MpuNTUser.pas von Luckie an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz