Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Benutzer einer Gruppe zu ordnen (https://www.delphipraxis.net/2527-benutzer-einer-gruppe-zu-ordnen.html)

Luckie 28. Jan 2003 02:41


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:
{ 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;
Das Problem ist nur, ich bekomme jedes mal "Gruppe nicht gefunden". Obwohl das auslesen so geht:
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);

Luckie 28. Jan 2003 04:37

So:
Delphi-Quellcode:
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);
Also mit NetLocalGroupAddMembers bekomme ich keine Fehlermeldung, aber er macht es auch nicht.

Christian Seehase 28. Jan 2003 13:15

Moin Luckie,

wie heute Früh im Chat versprochen hab' ich mir das noch einmal angesehen:

So geht's bei mir:

Delphi-Quellcode:
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;
Achtung:
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.

Luckie 28. Jan 2003 13:55

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.

Sharky 28. Jan 2003 14:30

Re: Benutzer einer Gruppe zu ordnen
 
Zitat:

Zitat von Luckie
...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):

Wenn Du dann so viel Kohle hast wie Bill musst Du uns aber zum essen einladen :lol:

Aber jetzt die Frage:
Warum nur EINE Gruppe? Ich kann doch Mitglied von verschiedenen Gruppen sein. Besonders von Gruppen die ich selber angelegt habe!

Christian Seehase 28. Jan 2003 16:40

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.

Luckie 28. Jan 2003 18:10

@Sharky: Das kann man ja auch wenn es fertig ist.

@Christian: Ja stimmt. Hast Recht.

Hansa 28. Jan 2003 18:16

Ich habe das Programm mit Novell getestet. Das stimmt soweit, aber Alter des Passworts nicht.

Gruß
Hansa

MadMason 28. Jan 2003 18:18

Re: Benutzer einer Gruppe zu ordnen
 
Zitat:

Zitat von Luckie
Kann ich ihn veröffentlichen bzw. als Alpha-Release zum Testen freigeben und dann das große Geld damit machen. :mrgreen:

ich kenn mich ja in der lizenzpolitik borlands nicht 100% aus aber ich glaube mit ner Personal darfst du deine Software nicht verkaufen sondern nur als freeware weitergeben.
korigier mich wenn ich mich irre :?:

Luckie 28. Jan 2003 18:25

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.
Seite 1 von 3  1 23      

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