![]() |
Lokal Adminrechte erlangen
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:
Mit den richten Anmeldedaten komme ich auch bis zum
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;
Delphi-Quellcode:
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)
ForceDirectories
Nutze ich ImpersonateLoggedOnUser falsch? Oder gibt es für sowas eine besser Möglichkeit? |
AW: Lokal Adminrechte erlangen
Das Impersonate gibt dem Prozess nicht plötzlich Adminrechte. Entweder ein Prozess wird mit Adminrechten gestartet, oder ohne. Das lässt sich nicht nachträglich ändern.
PS: Ich würde vielleicht auch hinterfragen ob das Programm wirklich für alle Benutzer unter C:\Programme installiert werden muss. Seit Windows 7 gibt es
Delphi-Quellcode:
, also C:\Users\Jupp\AppData\Local\Programs. Da braucht auch kein Mensch Adminrechte für, weil das ist ja nur für Jupp.
FOLDERID_UserProgramFiles
Selbst Anwendungen wie z.B. Visual Studio Code installieren sich standardmäßig dorthin. |
AW: Lokal Adminrechte erlangen
Speichere dein Programm doch unter CSIDL_APPDATA ab und gut ist.
Musste keine Handstände mit den Rechten machen, nur weil du versuchst unter CSIDL_PROGRAM_FILESX86 etwas abzulegen. |
AW: Lokal Adminrechte erlangen
Das ist aber "roaming" AppData (nicht lokal) und würde über jeden PC mit dem Benutzerkonto synchronisiert werden. Ich hätte das eher verstanden dass AppData\Local das richtige ist, denn manche PCs stehen außerhalb und greifen über eine langsame VPN-Verbindung zu, manche stehen im schnellen Firmennetz und brauchen das nicht.
|
AW: Lokal Adminrechte erlangen
Und nicht das hier ein Denkfehler geschieht "User mit Adminrechten" <> Administratoruser (unter Windows 10 zumindest).
|
AW: Lokal Adminrechte erlangen
Zitat:
Aber trotzdem würde mich interessieren wofür die Funktion Impersonate dann verwendet wird? Ich hatte das hier: ![]() |
AW: Lokal Adminrechte erlangen
Tippe mal darauf, dass ein danach gestarteter Prozess dann mit den entsprechenden Rechten läuft.
Wenn Dein Programm eine zweite Instanz seiner selbst startet, sollte es gehen. Mit 'nem Aufrufparameter versehen, sollte sich das für den Anwender unsichtbar realisieren lassen. Oder per CreateProcessAsUser eine zweite Instanz starten, die die Installation übernimmt. |
AW: Lokal Adminrechte erlangen
Zitat:
|
AW: Lokal Adminrechte erlangen
Zitat:
aber es ist einfacher die Rechte direkt beim Start eines Prozesses/Threads festzulegen, bzw. kurz nach dem Start umzuschalten. Im ![]() Und Ja, Admin ist nicht gleich Admin. Darum rauchen auch viele alte Codes (aus Zeiten von NT/XP) gern ab, weil sie nicht HabIchAdminrechte HabIchDiesesOderJenesRecht sondern BinIchAdministrator prüfen. Zitat:
Ich hatte mal ausversehn meinem Administator sämtliche Rechte geklaut ... der durfte dann weniger als ein Gast, obwohl der Administrator hieß und in der Gruppe Administratoren war. |
AW: Lokal Adminrechte erlangen
Gut, seit wann dem so ist hätte ich nicht gewusst aber erst bei Win10 ist mir das mal auf die Füße gefallen :stupid:
Und einige denken da halt nicht dran und setzen das Gedanklich gleich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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