AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Betriebssysteme Autologon W7 / LSA-Wert in Registry schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Autologon W7 / LSA-Wert in Registry schreiben

Ein Thema von berens · begonnen am 20. Jun 2011 · letzter Beitrag vom 23. Jun 2011
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

AW: Autologon W7 / LSA-Wert in Registry schreiben

  Alt 22. Jun 2011, 12:31
Die Unit habe ich auch benutzt oder die von Oliver. Aber schlag mich tot, ich finde im Code vom Usermanager nicht mehr die Stelle, an der ich den Autologin setze.

Puh, ich dachte schon, ich hätte unsauberen Code geschrieben, will sagen, habe sie gefunden:
Delphi-Quellcode:
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;
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (22. Jun 2011 um 12:36 Uhr)
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
441 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Autologon W7 / LSA-Wert in Registry schreiben

  Alt 23. Jun 2011, 20:15
Hi Luckie,
danke für den Code.

Wie ich mir schon gedacht habe, war bei mir die Umwandlung in Unicode das eigentliche Problem.

Die von Dir verwendete Funktion RtlInitUnicodeString habe ich unverschämterweise durch LsaInitUnicodeString aus diesen Thread ersetzt ( http://www.delphipraxis.net/97466-ls...komplexes.html ), da ich spontan für RtlInitUnicodeString die Unit nicht ausfindig machen konnte.

Da der Init-Code jedoch große Ähnlichkeit mit dem hat, den ich oben bereits gepostet habe, hoffe ich, dass er stimmt. Vielleicht mag jemand hier nochmal kurz drüberschauen, ob das Alles seine Richtigkeit hat:


Delphi-Quellcode:
Procedure LsaInitUnicodeString(Var LsaString: TLsaUnicodeString; Const WS:
  WideString);
Begin
  FillChar(LsaString, SizeOf(LsaString), 0);
  If WS <> 'Then
  Begin
    LsaString.Length:=Length(WS) * SizeOf(WideChar);
    LsaString.MaximumLength:=LsaString.Length + SizeOf(WideChar);
    LsaString.Buffer:=PWideChar(WS);
  End;
End;

function SetWinlogonPassword(const 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
    LsaInitUnicodeString(usServer, ''); // Ich schreibe immer nur auf LocalHost, deshalb muss usServer leer bleiben
    Status := LsaOpenPolicy(usServer, oa, POLICY_CREATE_SECRET, hPolicy);
    if (0 = Status) then // 0 = STATUS_SUCCESS
    begin
      LsaInitUnicodeString(usKeyName, 'DefaultPassword');
      LsaInitUnicodeString(usPassWord, PWideChar(Password));
      Status := LsaStorePrivateData(hPolicy, usKeyName, usPassword);
    end;
  finally
    LsaClose(hPolicy);
  end;
  Result := Status = 0;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  SetWinlogonPassword('1234567890');
end;
Insgesamt scheint es erst Mal zu funktionieren (in LSASectresView steht nun der selbe String wie mit Sysinternal Autologon).

Falls jemand von Euch zuhuuuufällig über ein verständliches Delphi-Beispiel für CryptProtectData oder die Updatebeschreibung (oder Gruppenrichtlinie?) von M$ stolpert, in der erklärt wird, dass seit dann-und-dann tatsächlich Plain-Text Passwörter für Autologon nicht mehr akzeptiert werden, wäre ich natürlich sehr dankbar um das Thema komplett abzurunden.

Vielen Dank speziell nochmal an Luckie, der -mal wieder- das Wochenende gerettet hat.
Lg Mathias



Edit1:
Nach weiterer Suche bin ich auf dieser Seite auf folgende Info gestoßen: AutoLogon prüft erst, ob mit LSA ein Passwort hinterlegt ist, und wenn nicht, wird als Notlösung der Plaintextwert aus der Registry genommen (Software\Microsoft\Windows NT\CurrentVersion\Winlogon). Das würde einiges erklären: Vielleicht habe ich vor der letzten Image-Erstellung versehentlich einmal "control userpasswords2" verwendet, und damit das LSA-Kennwort gesetzt. Damit war es dann egal, was unter WinLogon steht. Es erklärt auch, warum das Problem erst kürzlich bei allen (Neu-)Kunden zeitgleich aufgetaucht ist; das Problem gibt es wohl generell schon länger (s.u.). Mal gespannt, wie es mit der o.g. LSA-Lösung über Delphi sich in Zukunft verhält...

Quelle: http://social.technet.microsoft.com/...6-bf61d18b1a5c
Zitat:
July 06, 2010 3:30 PM MrBeatnik:
We have been having a similar problem, and have made some progress.

It seems the DefaultPassword entry in the registry is the 2nd place it checks for a password, but only if it cannot find a password in the 1st location. The 1st location is the LSA secret area (HKLM\Security\Policy\Secret\DefaultPassword).

It seems, in our case, that there was a LSA secret password. This was being used to autologin, but it was the wrong password. Any attmepts to fill in the DefaultPassword key were useless because it never checked there.

Using the control userpasswords2 allowed us to change the password... you may not be able to do this on the domain, but I assume this is due to group policy, since we are on the domain and don't have that issue. I managed to use a tool called autologon.exe (from the MS Shell team) to supply the correct password from the DefaultPassword key to the LSA.



Unfortunately I know of no real way to clear the LSA password without an extra tool.

You can test if this is the problem by:

1) Creating a local account and setting the registry manually to autologon with the DefaultPassword key. This should fail.

2) Now using userpasswords2, set the local account in the way described (if you can). This should remove the DefaultPassword key from the registry (proof that it is using the LSA). Now let it autologon.



Good luck!

I will be creating a new thread about clearing the LSA in Win7.

Edit2:

-.- Eben ist mir zusätzlich aufgefallen, dass ich in der Registry und meinem Quellcode fälschlicherweise den Wert "DefaultUserPassword" anstelle von dem korrekten "DefaultPassword" verwendet habe. Das wird auch seine Schuldigkeit zu dem Problem getan haben. Hier nochmal die korrekte Version:

Zitat:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"AutoAdminLogon"="1"
"DefaultUserName"="MeinUsername"
"DefaultDomainName"="MeinPCNameOderDomain"
"DefaultPassword"="1234567890"

Geändert von berens (24. Jun 2011 um 15:31 Uhr) Grund: Weitere Info über mögliche Ursache des Problems
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 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