Registriert seit: 22. Feb 2017
991 Beiträge
|
Lokal Adminrechte erlangen
30. Apr 2020, 08:38
Mein Programm wird in der Regel aus einem Netzlaufwerk gestartet. Für einige Client's, die über VPN angebunden sind, soll eine Funktion mit rein, das Programm lokal zu installieren, da die VPN teilweise keine große Bandbreite hat.
Ich versuche über folgende Methoden mein Programm kurz und knapp lokal auf den Rechner zu bringen.
Delphi-Quellcode:
function Impersonate(const User, PW: string): Boolean;
var
LogonType : Integer;
LogonProvider : Integer;
TokenHandle : THandle;
strAdminUser : string;
strAdminDomain : string;
strAdminPassword : string;
i: Integer;
begin
LogonType := LOGON32_LOGON_INTERACTIVE;
LogonProvider := LOGON32_PROVIDER_DEFAULT;
strAdminUser := User;
if Pos('\', strAdminUser)=0 then
begin
strAdminDomain:='.';
end else begin
strAdminDomain := Copy(strAdminUser, 1, pos('\', strAdminUser)-1);
strAdminUser := Copy(strAdminUser, Pos('\', strAdminUser)+1, Length(strAdminUser));
end;
strAdminPassword := PW;
if strAdminDomain<>'' then
begin
Result := LogonUser(PChar(strAdminUser), PChar(strAdminDomain),
PChar(strAdminPassword), LogonType, LogonProvider, TokenHandle);
end else begin
Result := LogonUser(PChar(strAdminUser), nil,
PChar(strAdminPassword), LogonType, LogonProvider, TokenHandle);
end;
if Result then
begin
Result := ImpersonateLoggedOnUser(TokenHandle);
end;
end;
function LocalInstallation(UserName, Password: string): string;
var
Directory: string;
begin
Result:='';
if Impersonate(UserName, Password) then
begin
Directory:=getWinSpecialFolder(CSIDL_PROGRAM_FILESX86)+'MeinProgramm\';
if ForceDirectories(Directory) then
begin
if CopyFile(PChar(Application.Exename), PChar(Directory+ExtractFileName(Application.ExeName)), True) then
begin
CreateShortcut(Directory+ExtractFileName(Application.ExeName), _DESKTOP, '',Directory,'','', 'MeinProgramm.lnk');
CreateShortcut(Directory+ExtractFileName(Application.ExeName), _STARTMENU, 'QualityCheck',Directory,'','', 'MeinProgramm.lnk');
Result:=Directory+ExtractFileName(Application.ExeName);
end else
RaiseLastOSError;
end else
RaiseLastOSError;
end;
end;
Mit den richten Anmeldedaten komme ich auch bis zum ForceDirectories
in der Methode "LocalInstallation". Da kommt immer "Zugriff verweigert" (Nehme zum Testen lokales Administratorkonto). Wenn ich mich als Administrator im Windows anmelde kann ich im Windows-Explorer den Ordner ohne weitere Probleme anlegen. (Windows 10)
Nutze ich ImpersonateLoggedOnUser falsch? Oder gibt es für sowas eine besser Möglichkeit?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
|