![]() |
AW: Passwort automatisch eingeben
Ebenso, wie man mit dem UAC-Dialogen nicht interagieren kann, gibt es auch bei RUNUS aus Sicherheitsgründen keinen Paramter, womit man das Passwort reingeben kann.
Aber es lässt sich via PIPE übergeben. ![]() Beim CreateProcess kann man auch so eine PIPE einrichten, siehe lpStartupInfo.hStdInput auch wenn es hier sinnlos wäre, da man auch direkt CreateProcessAsUser/CreateProcessWithLogonW verwenden kann. |
AW: Passwort automatisch eingeben
Also KodeZwerg,
habe deinen Code mal probiert. Fehler gibt es mir keine aus allerdings wird das Programm nicht ausgeführt...leider. Hier der Code dazu:
Delphi-Quellcode:
unit Unit2;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ShellAPI; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure RunAsExec(hWnd: HWND; aFile: string; aParameters: string); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.RunAsExec(hWnd: HWND; aFile: string; aParameters: string); var SEI: TShellExecuteInfo; begin FillChar(SEI, SizeOf(SEI), 0); SEI.cbSize := sizeof(SEI); SEI.Wnd := hWnd; SEI.fMask := SEE_MASK_NOCLOSEPROCESS; SEI.lpVerb := 'runas'; SEI.lpFile := PChar(aFile); SEI.lpParameters := PChar(aParameters); SEI.nShow := SW_SHOWNORMAL; if not ShellExecuteEx(@SEI) then RaiseLastOSError; end; procedure TForm2.Button1Click(Sender: TObject); var DateiName: string; Parameter: string; begin DateiName := 'C:\temp\test.exe'; Parameter := ' ' + 'administrator' + ' ' + 'password'; RunAsExec(Application.Handle, DateiName, Parameter); end; end. @himitsu Da schon viele von CreateProcessWithLogonW geredet haben. Hast du dafür irgendein Beispiel. Ich weiß nicht wie ich das auf meinen Fall anwenden muss, sodass es funktioniert:( |
AW: Passwort automatisch eingeben
Nur das habe ich bisher probiert:
Delphi-Quellcode:
Das ist ein angeblich lauffähiges Beispiel aus einem anderen Thema. Funktioniert bei mir leider nicht.:(
program runadmin;
{$APPTYPE CONSOLE} uses System, SysUtils, JwaWinBase; var si: STARTUPINFOW; pif: PROCESS_INFORMATION; res: Boolean; s: string; cmd: PWideChar; begin if Length(ParamStr(1)) = 0 then WriteLn( 'RunAdmin - Kommando unter Administrator-Konto ausführen' + #13#10 + 'Usage: runadmin <command>') else try si.cb := SizeOf(startupinfow); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; si.lpReserved := nil; si.lpDesktop := nil; si.lpTitle := 'Konsole'; getmem(cmd,Length(ParamStr(1))*2); cmd := StringToWideChar(ParamStr(1),cmd,Length(ParamStr(1))*2); res := CreateProcessWithLogonW('Administrator', '', 'password', LOGON_WITH_PROFILE, nil,cmd,CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pif); if booltostr(res) = '0' then begin str(GetLastError, s); WriteLn('Beim Ausfuehren des Befehls "' + ParamStr(1) + '"'); WriteLn('ist der Fehler ' + s + ' aufgetreten.'); Halt(1); end; except on E: Exception do begin WriteLn('Beim Ausfuehren des Befehls "' + ParamStr(1) + '"'); WriteLn('ist der Fehler ' + E.Message + ' aufgetreten.'); Halt(1); end; end; end. |
AW: Passwort automatisch eingeben
Existiert ein Benutzerkonto namens "Administrator" ?
|
AW: Passwort automatisch eingeben
Ja das gibt es:wink:
|
AW: Passwort automatisch eingeben
Okay, ich wollte nur sichergehen das man das als Fehler schonmal ausschließen kann. Zu morgen sollte ich was funktionierendes gebastelt bekommen.
|
AW: Passwort automatisch eingeben
Das kling ja schonmal ganz gut. Vielen Dank erstmal für die Mühe.
|
AW: Passwort automatisch eingeben
Also ich mache da aktuell so (allerdings in Lazarus):
Delphi-Quellcode:
//Oberhalb des "implementation" Bereichs
function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: LPWSTR; dwLogonFlags: dword; lpApplicationName, lpCommandLine: LPWSTR; dwCreationFlags: dword; lpEnvironment: pointer; lpCurrentDirectory: LPWSTR; lpStartupInfo: PStartUpInfoW; lpProcessInfo: PProcessInformation): boolean; stdcall; external 'advapi32.dll';
Delphi-Quellcode:
//Im "implementatrion" Bereich
//Prozess als bestimmten Benutzer starten function CreateProcessAsLogon(const User, PW, Application, param, CmdLine: WideString): DWORD; var ws : WideString; si : TStartupInfoW; pif : TProcessInformation; begin ZeroMemory(@si, sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; if CmdLine = '' then begin ws := Application; end else begin ws := Application + ' "' + CmdLine + '"'; end; SetLastError(0); SI.cb := SizeOf(TStartupInfo); if CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PWideChar(param), @si, @pif) then begin sleep(500); if PIf.dwProcessId > 0 then begin AppPID := PIf.dwProcessId; CloseHandle(PIf.hProcess); CloseHandle(PIf.hThread); end; end; Result := GetLastError; end; |
AW: Passwort automatisch eingeben
Zitat:
um nochmal darauf einzugehen. Das läuft jetzt teilweise bei mir. Heißt wenn ich den Parameter-String frei lasse funktioniert es. Sobald ich in den Parameter-String Benutzername und Passwort eintrage, öffnet er mir das Programm nicht mehr. Bringt aber auch keinen Fehler....:( |
AW: Passwort automatisch eingeben
Jetzt könnte man den ExitCode des Programms noch prüfen.
Zitat:
SEI.pHandle wird zuückgegeben, aber niemals geschlossen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 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