Entwickler-Ecke

Open Source Projekte - AutoLoginXP


battledevil - Do 11.01.07 16:56
Titel: AutoLoginXP
Hallo Leute,

Ich hab ein kleines Tool geschrieben, mit dem man das Auto-Login unter XP an- und abschalten kann. Nix gewaltiges, aber es spart Zeit, wenn man diese Option aktivieren will.

Nico


Delete - Do 11.01.07 17:42

Warum entfernst du zumindest nicht wieder das Passwort, wa sim Klartext dort in der Registry steht, nicht wieder, wenn du das AutoLogin deaktivierst? Auch schon das Schreiben des Passwortes dort in die Registry ist eine potentielle Sicherheitlücke. Guck dir mal TweakXP an. Wenn du dort das AutoLogin aktivierst, erscheint das Passwort dort nicht im Klartext.


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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
function SetWinlogonPassword(const Server, Password: WideString): Boolean;
var
  oa                : TLSAObjectAttributes;
  hPolicy           : LSA_HANDLE;
  usServer          : TLSAUnicodeString;
  usKeyName         : TLSAUnicodeString;
  usPassWord        : TLSAUnicodeString;
  Status            : NTSTATUS;
begin
  ZeroMemory(@oa, sizeof(oa));
  oa.Length := sizeof(oa);
  try
    RtlInitUnicodeString(@usServer, PWideChar(Server));
    Status := LsaOpenPolicy(usServer, oa, POLICY_CREATE_SECRET, hPolicy);
    if (NT_SUCCESS(Status)) then
    begin
      RtlInitUnicodeString(@usKeyName, 'DefaultPassword');
      RtlInitUnicodeString(@usPassWord, PWideChar(Password));
      Status := LsaStorePrivateData(hPolicy, usKeyName, usPassword);
    end;
  finally
    LsaClose(hPolicy);
  end;
  Result := NT_SUCCESS(Status);
end;

////////////////////////////////////////////////////////////////////////////////

function SetAutoWinlogon(Server: WideString; Activate: Boolean; Username, Password: WideString): Boolean;
var
  usPassword        : TLSAUnicodeString;
  usServer          : TLSAUnicodeString;
  reg               : TMpuRegistry;
begin
  Result := False;
  reg := TMpuRegistry.CreateW(Server, HKEY_LOCAL_MACHINE);
  if (Assigned(reg)) then
  try
    reg.Connect;
    if reg.OpenKeyW('Software\Microsoft\Windows NT\CurrentVersion\Winlogon', KEY_WRITE) = 0 then
    begin
      // Username
      if Username <> '' then
        reg.WriteStringW('DefaultUserName', Username)
      else
        reg.DeleteValueName('DefaultUserName');

      // Domain
      if Server <> '' then
        // TODO: full unicode support
        reg.WriteStringW('DefaultDomainName', Server)
      else
        reg.DeleteValueName('DefaultDomainName');

      // Init unicode string
      RtlInitUnicodeString(@usPassword, PWideChar(Password));
      RtlInitUnicodeString(@usServer, PWideChar(Server));
      // Set the password in secret stash
      if SetWinlogonPassword(usServer.Buffer, usPassword.Buffer) then
      begin
        Result := True;
      end;
      reg.DeleteValueName('DefaultPassword');

      // Activate autologon
      reg.WriteString('AutoAdminLogon', IntToStr(ord(Activate)));
    end;
  finally
    reg.Free;
  end;
end;

Damit wird das Passwort in dem Secret Stash der Registry abgelegt, wo es nur das System auslesen kann.


battledevil - Do 11.01.07 17:48

Danke für den Tip, ich werde das einbauen.
Kannst Du mir zufällig sagen, welche Units ich für TLSAObjectAttributes usw. einbinden muss?


Delphi-Laie - Mi 17.03.10 23:46

user profile iconbattledevil hat folgendes geschrieben Zum zitierten Posting springen:
Danke für den Tip, ich werde das einbauen.
Kannst Du mir zufällig sagen, welche Units ich für TLSAObjectAttributes usw. einbinden muss?


Über die windowseigene Suchfunktion (*.pas) im Delphi-Verzeichnis, das über viele Jahre mit Borland tituliert wurde (auch zu Codegear-Zeiten) und das hoffentlich auch die Quelltexte beinhaltet, suchen, und den Namen der Unit als Suchwort zusätzlich vor der Suche eingeben. Damit müßte man zum Ziele gelangen.

Was anderes: Was sollen denn die Sternchen im Paßwortedit für einen (höheren) Sinn haben?