Autor Beitrag
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Do 11.09.03 14:31 
Hi Leute,

ich bin von der nonVCL zur LogonUser Fkt gerutscht, bei dieser benötige ich allerdings die SE_TCB_NAME Privilege, ich hatte zunächst dies mit OpenProcessToken, LookUpPrivilegeValue und notfalls per AdjustTokenPrivileges zu setzen versucht, doch ich bekomme jetzt die Meldung ERROR_ACCESS_DENIED bei diesem Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
Function UserLogon: boolean;
var
     NeededBytes              : DWord;
     tokenbuf                 : TTokenPrivileges;
     prevtokenbuf             : TTokenPrivileges;
     hToken                   : THandle;
     PCName, UserName : string;
 begin
  result := false;
  PCName := ReturnComputerName;
  UserName := ReturnUser;
  if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken)then
   begin
    if not LookupPrivilegeValue(nil,'SeTchPrivilege',tokenbuf.Privileges[0].Luid) then
     begin
      tokenbuf.PrivilegeCount := 1;
      tokenbuf.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hToken,False,tokenbuf,sizeOf(TTokenPrivileges),
         prevtokenbuf,NeededBytes) then
          result := LogonUser(UserName,'',PChar(InputBox(UserName,'Please enter your password','')),LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,TOKEN);
    end;
  end;
end;


könnte man das Recht per LsaAddAccountRights bzw. LSA API lösen? Oder gibs da keine Möglichkeit (nur Kernel intern?) ?

Zu den LSA Datenstructuren, gibs die in ner Delphi Unit oder muss ich selbst erstellen ? (Wenn ja in welcher)
(Im SDK wird die Advapi32.lib und Ntsecapi.h genannt.)

Umgebungsvariablen: Win2k, User mit Admin Rechten

Ich hatte da auch ne nonprogramming Lösung gelesen
Systemsteuerung\Verwaltung\Lokale Sicherheitsrichtlinie ausführen; dort Lokale Richtlinien -> Zuweisen von Benutzerrechten auswählen und schließlich doubleClick auf 'Einsetzen als Teil des Betriebssystems' dort kann man dann die Personen hinzufügen. Laut der Infoquelle (deren URL ich leider nicht mehr weiss -> google.search) sollte dies die Fehlermeldung ERROR_PRIVILEGE_NOT_HELD verhindern.

Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt

_________________
mfg
Tana´Ri
Tana´Ri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Fr 12.09.03 09:03 
Hi Leute,

alos wenn ich den User als Teil des Systems registriert habe (in Systemsteuerung\Verwaltung\Lokale Sicherheitsrichtlinie), dann funktionierts :D

nur möchte ich das nicht per hand erledigen, also ist mein gedanke dies über das Subsystem Local Security Authority (LSA) zu probieren. Dabei ergibt sich jedoch ein Problem er kennt die Lsa Funktionen nicht und ich weiß nicht welche Unit bzw. Dll ich dazu benötige, wenn mir jemand weiterhelfen könnte wäre echt super.

ps: für einen HeimPC könnte diese Funktion als LoginAbfrage erstellen und seine User in den Sicherheitsrichtlinien registrieren. (wenn er nicht registriert ist gibt die Fkt False zurück)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
Function UserLogon: boolean;
var
     NeededBytes              : DWord;
     tokenbuf                 : TTokenPrivileges;
     prevtokenbuf             : TTokenPrivileges;
     hToken                   : THandle;
     PCName, UserName         : string;
 begin
  result := false;
  PCName := ReturnComputerName;
  UserName := ReturnUser;
  if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken)then
   begin
    if not LookupPrivilegeValue(nil,'SeTchPrivilege',tokenbuf.Privileges[0].Luid) then
     begin
      tokenbuf.PrivilegeCount := 1;
      tokenbuf.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hToken,False,tokenbuf,sizeOf(TTokenPrivileges),
         prevtokenbuf,NeededBytes) then
         result := LogonUser(ReturnUser,'',PChar(InputBox(ReturnUser,
                      'Please enter your password','')), LOGON32_LOGON_NETWORK,
                      LOGON32_PROVIDER_DEFAULT,TOKEN);
    end;
  end;
end;


ps: für username und pcname muesst ihr noch sorgen :!:

_________________
mfg
Tana´Ri