![]() |
Benutzer einer Gruppe zu ordnen
So es geht in die letzte Runde des User-Managers. Wenn das Problem gelöst ist. Kann ich ihn veröffentlichen bzw. als Alpha-Release zum Testen freigeben und dann das große Geld damit machen. :mrgreen:
Es geht jetzt darum einem Benutzer einer Gruppe zu zuordnen. Folgender Code läßt sich prima kompilieren (beide Versionen):
Delphi-Quellcode:
Das Problem ist nur, ich bekomme jedes mal "Gruppe nicht gefunden". Obwohl das auslesen so geht:
{ 1. Version }
{dwEntries := 0; if IsDlgButtonChecked(hApp, IDC_CHKISADMIN) = BST_CHECKED then begin Inc(dwEntries); setlength(sGroupArray, dwEntries); sGroupArray[dwEntries-1] := 'Administratoren'; end; if IsDlgButtonChecked(hApp, IDC_CHKISPOWERUSER) = BST_CHECKED then begin Inc(dwEntries); setlength(sGroupArray, dwEntries); sGroupArray[dwEntries-1] := 'Hauptbenutzer'; end GetMem(gui0, dwEntries*sizeof(Pointer)); for i := 0 to dwEntries-1 do begin Inc(Integer(gui0), sizeof(Pointer)); PGroupInfo0(gui0)^.grpi0_name := PWideChar(WideString(sGroupArray[i])); end; dwError := NetUserSetGroups(nil, PWideChar(WideString(sUser)), 0, gui0, dwEntries); } //NetAPIBufferFree(gui0); // <- mag er nicht //FreeMem(gui0, dwEntries*sizeof(Pointer)); // <- mag er auch nicht :o( { 2. Version } if IsDlgButtonChecked(hApp, IDC_CHKISPOWERUSER) = BST_CHECKED then dwError := NetGroupAddUser(nil, PWideChar(WideString('Hauptbenutzer')), PWideChar(WideString(sUser))) else dwError := NetGroupDelUser(nil, PWideChar(WideString('Hauptbenutzer')), PWideChar(WideString(sUser))); case dwError of ERROR_ACCESS_DENIED : s := 'Zugriff verweigert.'; ERROR_INVALID_PARAMETER : s := 'Ungültiger Parameter.'; NERR_InvalidComputer : s := 'Ungültiger Computer'; NERR_NotPrimary : s := 'Operation darf nur auf dem Domain-Controller ausgeführt werden.'; NERR_SpeGroupOp : s := 'Operation darf nicht auf diese Gruppe angewandt werden.'; NERR_LastAdmin : s := 'Der letzte macht das Licht aus, aber nicht bei Windows. :o)' +#13#10+'Der letzte Administrator Account kann nicht gelöscht werden'; NERR_BadPassword, NERR_PasswordTooShort : s := 'Ungültiges Passwort'; NERR_UserNotFound : s := 'Ungültiger Benutzer.'; NERR_GroupNotFound : s := 'Gruppe nicht gefunden.'; NERR_Success : s := 'Konto erfolgreich geändert.'; end;
Delphi-Quellcode:
if sUser <> '' then
begin if NetUserGetLocalGroups(nil, PWideChar(WideString(sUser)), 0, 0, gui0, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal) = NERR_SUCCESS then tmp := gui0; begin for i := 0 to dwEntriesRead-1 do begin s := String(PGroupInfo0(gui0)^.grpi0_name); if s = 'Administratoren' then CheckDlgButton(hApp, IDC_CHKISADMIN, Integer(TRUE)); if s = 'Hauptbenutzer' then CheckDlgButton(hApp, IDC_CHKISPOWERUSER, Integer(TRUE)); if s = 'Benutzer' then CheckDlgButton(hApp, IDC_CHKISUSER, Integer(TRUE)); if s = 'Sicherungs-Operatoren' then CheckDlgButton(hApp, IDC_CHKISBACKUPOP, Integer(TRUE)); if s = 'Replikations-Operator' then CheckDlgButton(hApp, IDC_CHKISREPOP, Integer(TRUE)); if s = 'Gäste' then CheckDlgButton(hApp, IDC_CHKISGUEST, Integer(TRUE)); Inc(Integer(gui0), sizeof(pointer)); end; //Messagebox(0, pointer(s), '', 0); end; NetAPIBufferFree(tmp); |
So:
Delphi-Quellcode:
Also mit NetLocalGroupAddMembers bekomme ich keine Fehlermeldung, aber er macht es auch nicht.
GetMem(lgrmi, dwEntries*sizeof(Pointer));
for i := 0 to dwEntries-1 do begin Inc(Integer(gui0), sizeof(Pointer)); PLocalGroupInfo0(lgrmi)^.lgrpi0_name := PWideChar(WideString(sGroupArray[i])); end; dwError := NetLocalGroupAddMembers(nil, PWideChar(WideString(sUser)), 0, lgrmi, dwEntries); |
Moin Luckie,
wie heute Früh im Chat versprochen hab' ich mir das noch einmal angesehen: So geht's bei mir:
Delphi-Quellcode:
Achtung:
var
pGroupname : PWideChar; pMember : PLOCALGROUP_MEMBERS_INFO_3; dwResult : NET_API_STATUS; begin pGroupName := AllocMem((Length('Hauptbenutzer')+1) shl 1); pMember := AllocMem(SizeOf(LOCALGROUP_MEMBERS_INFO_3)); pMember.lgrmi3_domainandname := AllocMem((Length('<Rechnername>\testuser')+1) shl 1); try // Kein Length + 1, wegen der abschliessenden #00#00 StringToWideChar('Hauptbenutzer',pGroupName,Length('Hauptbenutzer') shl 1); StringToWideChar('<Rechnername>\testuser',pMember.lgrmi3_domainandname,Length('<Rechnername>\testuser') shl 1); dwResult := NetLocalGroupAddMembers(nil,pGroupName,3,pMember,1); case dwResult of NERR_SUCCESS : ShowMessage('OK'); NERR_GROUPNOTFOUND : ShowMessage('Group not found'); else ShowMessage(SysErrorMessage(dwResult)+#13#10+IntToStr(dwResult)); end; finally FreeMem(pGroupname,(Length('Hauptbenutzer')+1) shl 1); FreeMem(pMember.lgrmi3_domainandname,(Length('<Rechnername>\testuser')+1) shl 1); FreeMem(pMember,SizeOf(LOCALGROUP_MEMBERS_INFO_3)); end; end; Eventuell musst Du noch was im Aufruf anpassen, da ich nicht die Jedi Units benutze. <Rechnername> muss natürlich gegen den Namen des Rechners ausgetauscht werden, auf dem die Funktion aufgerufen wird, aber Du wirst ja eh' nicht drum herumkommen das was ich da als Stringliterale angegeben habe in Form von Stringvariablen zu benutzen. |
Ich werde mir dan nachher mal ankucken(, ich muß noch etwas von der Nacht nachholen. :wink:) . Wenn es bei dir klappt, aber bei mir nicht, dann war ich zu blöd es einzubauen. :roll:
Stichwort Rechnername: Es geht mir erstmal nur um den lokalen Rechner. Und wenn man die NetUserxxx Funktionen mit nil als Rechnernamen aufruft, wird immer der lokale Rechner genommen. Sollte hier nicht anders sein. Danke für deine Mühe. |
Re: Benutzer einer Gruppe zu ordnen
Zitat:
Aber jetzt die Frage: Warum nur EINE Gruppe? Ich kann doch Mitglied von verschiedenen Gruppen sein. Besonders von Gruppen die ich selber angelegt habe! |
Moin Luckie,
an der Stelle, an der ich <Rechername> geschrieben habe, muss der Name des lokalen Rechners stehen, damit die Funktion weiss, von wo sie die Userinformationen ziehen soll. Es wird an der Stelle die Angabe von Arbeitsgruppe oder Domain erwartet, aus der der User stammt. Ist es ein lokaler User muss hier also der Name des Rechners angegeben werden. Du könntest hier ja ebensogut einen Domänenuser angeben. Das Du für den "Server" hier nil eintragen kannst hat damit nichts zu tun. An dieser Stelle wird ja festgelegt, von welchem Rechner die Lokale Gruppe gemeint ist, der der User hinzugefügt werden soll. Prinzipiell kann diese Funktion ja auch auf anderen Rechnern als dem eigenen, User zu lokalen Gruppen hinzufügen. |
@Sharky: Das kann man ja auch wenn es fertig ist.
@Christian: Ja stimmt. Hast Recht. |
Ich habe das Programm mit Novell getestet. Das stimmt soweit, aber Alter des Passworts nicht.
Gruß Hansa |
Re: Benutzer einer Gruppe zu ordnen
Zitat:
korigier mich wenn ich mich irre :?: |
Das stimmt, aber was spricht dagegen sich das von einem Freund kompilieren zu lassen, der Professional oder höher hat?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 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