Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#1

Lokal Adminrechte erlangen

  Alt 30. Apr 2020, 07: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.
  Mit Zitat antworten Zitat