Hallo zusammen,
in Windows 8.x habe ich das Problem, dass der Aufruf
Process.Start(Path.Combine(StartupPath, "Test.pdf"));
nicht richtig funktioniert.
Was heiss das genau: Meine Applikation startet mit Admin-Rechten. Wenn ich nun diesen Befehl ausführe, wird zwar der Prozess unter dem aktuell angemeldetem Benutzer gestartet, jedoch ist die GUI des Adobe Readers nicht ersichtlich.
Starte ich jedoch die gleiche Applikation ohne Admin-Rechte, funktioniert alles so wie es soll.
Nun die Frage:
Wie muss ein solcher Aufruf unter Windows 8.x richtigerweise implementiert werden?
Ziel soll sein, einfach ein PDF öffen zu können, egal ob die Applikation welche das durchführen soll, über Admin-Rechte verfügt oder nicht.
PS:
Folgendes habe ich bereits probiert, ebenfalls ohne Erfolg
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.UseShellExecute = true;
procInfo.WorkingDirectory = Environment.CurrentDirectory;
procInfo.FileName = Path.Combine(StartupPath, "Test.pdf");
//procInfo.Verb = "runas";
try
{
Process.Start(procInfo);
}
catch { }
"runas" ist auskommentiert, weil wenn das aktiviert ist, kommt die Fehlermeldung, dass der Datei keine Applikation zugewiesen ist.
Danke für die Hilfe.
Vermutlich musst Du auch hier einen Token duplizieren; das funktioniert über das Handle des Users (am besten über die DesktopShell, da dies keine Adminrechte hat, egal bei welchem User) und mit dem Token dann den Prozess starten (mit Hilfe von CreateProcessWithTokenW
).
Edit: Launch a Process as Standard User from an Elevated Process und dahingehend User Account Control Helpers scheinen sehr vielversprechend zu sein.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi Abt,
Danke für diesen für diesen Link. Auf diese Art und weise funktioniert es in der Tat.
Nun habe ich noch die Unschönheit, dass ich bei dieser Lösung die Applikation angeben muss welche ich starten will.
Mit dem Aufruf
Process.Start(Path.Combine(StartupPath, "Test.pdf"));
übergebe ich dem System lediglich das PDF. Das System öffnet dann von sich aus das installierte PDF Programm.
Bei der anderen Lösung, muss ich wissen, ob Adobe PDF oder ein anderer PDF Viewer installiert ist, damit ich den Pfad zu dieser Exe angeben könnte.
Gibt es dazu ggf. auch eine Lösung?
Welche der beiden Varianten hast denn genutzt?
Zur Not machst eben ne eigene Exe, der Du nur den Pfad übergibst und die dann Process.Start() ausführt. Nicht schön aber selten.
Du bist Entwickler - lass Dir was einfallen, was für Dich gut ist 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
ich verwende nun den folgenden Aufruf:
Process proc = UserAccountControl.CreateProcessAsStandardUser("calc.exe", "");
sobald die beiden Bibliotheken eingebunden sind, steht diese Funktion zur Verfügung.
haha, de mit der eigenen Exe ist, nett aber wie von dir gesagt "unschön".
Währe gerade passend gewesen, wenn man das gleich komfortabel hätte verwenden können. Aber so ist es def. besser als zuvor.
Ich kenn die Bibliotheken auch nicht auswendig. Das Ding ist ja MsPL lizienziert (=> mach damit was Du willst).
Zieh Dir halt den Quellcode und pass es Dir an.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ist C++, nicht gerade mein "Streckenpferd" 😉
Mal schauen...zur not wirklich mit der eigenen Exe 😄
Danke für die Hilfe!