none
eigenes Programm mit "run as" und den dazugehörigen Rechten laufen lassen RRS feed

  • Frage

  • Hallo miteinander,

    ich habe ein Programm geschrieben welches mir über TCP/IP Daten von einer Steuerung anzeigt und auch loggt (Visualisierung und Datenlogger).

    Ich habe jetzt aber das Problem, dass das Programm am Ende auf einem Panel-PC laufen wird, welcher nur mit einem Standard-Konto (stark eingeschränkte Rechte) läuft. Das heißt ich muss mein Programm als bestimmter Nutzer (erweiterte Rechte)  starten, um damit auch auf das Netzlaufwerk Zugriff zu bekommen und zu schreiben. Es soll in zyklischen Abständen dann das Logfile in einem bestimmten Ordner im Netzwerk kopiert werden, damit es für andere zu Verfügung steht.

    Der Versuch mit der "app.manifest" funktioniert nicht, da mir Visual Studio 2013 Express dann folgendes meldet:

    Die Anforderungsausführungsebene "requireAdministrator" wird von ClickOnce nicht unterstützt.

    Wie kann ich das jetzt vielleicht direkt im Code realisieren? Ich habe bisher verschiedene Code-Schnippsel gefunden, kann damit jetzt aber nicht wirklich etwas anfangen bzw hab es vielleicht auch nicht verstanden.

    Schon recht herzlichen Dank im Vorraus!

    Samstag, 31. Mai 2014 12:06

Antworten

  • Hallo,
    ClickOnce soll erhöhte Sicherheit für den Benutzer bieten. Darum können damit keine Programma ausgeliefert werden, die höhere Berechtigungen benötigen. Allerdings würde ich trotzdem das Manifest verwenden, da es der von Microsoft vorgesehene Weg ist.

    Dafür wirst du allerdings auf ein anderes Setupprojekt ausweichen müssen. Da du VS Express verwendest, wird nichts mit VS funktionieren. (Da lediglich die kaufversionen Erweiterungen unterstützen.)
    Ich kenne mich dabei aber auch nicht sonderlich gut aus, weswegen ich nur hierauf verlinken kann.

    Das Neustarten würde natürlich auch funktionieren. Siehe hier. Besser wäre es natürlich direkt auf die benötigten Berechtigungen zu prüfen, ist aber nicht zwingend notwenig. Allgemein wäre das Manifest natürlich besser.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Flitzpiepe84 Montag, 2. Juni 2014 21:41
    Samstag, 31. Mai 2014 14:53
    Moderator
  • Also als kleines Update zur ganzen Sache:

    Mein Problem ließ sich lösen bzw. war eigentlich schon gelöst mit dem Neustart des Programmes als anderer Benutzer. siehe der zweite Link von Tom.

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] CommandLineArgs = Environment.GetCommandLineArgs(); // Befehlszeilenargumente auslesen
        if (CommandLineArgs.Length <= 1 || CommandLineArgs[1] != "restarted") // ist das 2. Argument (das 1. ist immer der Dateipfad) != restarted, wurde das Programm noch nicht neugestartet
        {
            ProcessStartInfo ProcessInfo = new ProcessStartInfo(Application.ExecutablePath, "restarted"); // Prozessinformationen festlegen, Anwendungspfad und unser eigenes Argument "restarted"
            ProcessInfo.Verb = "runas"; // Befehl zum Ausführen als Administrator
            Process.Start(ProcessInfo); // Prozess mit den eingestellten Informationen starten
        }
        else
            Environment.Exit(0); // wurde das Argument "restarted" übergeben, wurde das Programm bereits gestartet, um die Endlosrekursion zu verhindern, nicht erneut aufrufen
    }

    Ich habe dies nur nicht als funktionierend testen können, weil unserer Admin in der Firma mal wieder irgendwas "gedreht" hatte in den Rechten. So dass mein Benutzerkonto von diesem PC aus keine Rechte mehr hatte für dieses Laufwerk. Jetzt geht es jedenfalls.

    Falls jemand dazu Anmerkungen und Verbesserungsvorschläge zum dem Code-Schnippsel hat, wäre ich recht erfreut.

    PS.: Noch einmal recht herzlichen Dank an Tom, ich steh mit C# noch recht am Anfang, weshalb für mich manche Dinge einfach nicht gleich so schlüssig oder selbsterklärend sind


    Montag, 2. Juni 2014 21:40

Alle Antworten

  • Hallo,
    ClickOnce soll erhöhte Sicherheit für den Benutzer bieten. Darum können damit keine Programma ausgeliefert werden, die höhere Berechtigungen benötigen. Allerdings würde ich trotzdem das Manifest verwenden, da es der von Microsoft vorgesehene Weg ist.

    Dafür wirst du allerdings auf ein anderes Setupprojekt ausweichen müssen. Da du VS Express verwendest, wird nichts mit VS funktionieren. (Da lediglich die kaufversionen Erweiterungen unterstützen.)
    Ich kenne mich dabei aber auch nicht sonderlich gut aus, weswegen ich nur hierauf verlinken kann.

    Das Neustarten würde natürlich auch funktionieren. Siehe hier. Besser wäre es natürlich direkt auf die benötigten Berechtigungen zu prüfen, ist aber nicht zwingend notwenig. Allgemein wäre das Manifest natürlich besser.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Flitzpiepe84 Montag, 2. Juni 2014 21:41
    Samstag, 31. Mai 2014 14:53
    Moderator
  • deinen zweiten Link mit dem Neustart habe ich schon zuvor ausprobiert. Funktioniert irgendwie aber nur teilweise. Irgendwas habe ich dabei nicht ganz verstanden oder verkehrt gemacht. Denn sobald ich auf das Laufwerk oder in einen Ordner schreiben will, für den das Standard-Profil keine Berechtigung hat, wird mir eine Fehlermeldung geworfen, dass das Programm keine ausreichenden Berechtigungen hätte. Dabei habe ich aber diesen Neustart und die Anmeldung als "erweiterten" Benutzer durchgeführt.

    Muss ich danach in irgendeiner Form diese Rechte an meine Funktion im Code weitergeben oder passiert das eigentlich automatisch?

    Samstag, 31. Mai 2014 20:50
  • Hier sheint sich irgend etwas geändert zu haben. Mir war so, als ob ich es mal unter Windows 7 so probiert hätte. Unter Windows 8 bekomme ich es aber auch nicht mehr zum laufen.
    Ich bin mit meinem Latein am Ende.

    Ich würde das Manifest verwenden.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 31. Mai 2014 22:07
    Moderator
  • Sonntagsfrage:

    VisualStudio 2010 / VB.Net / Framework 4.0 / Kompilierung x86

    Muss man das ...exe.manifest mit ausliefern, oder wird alles automatisch in die EXE einkompiliert? Ich denke doch eigentlich letzteres. Hatte bislang immer angenommen, dass VS die Einträge aus der app.manifest dazu verwendet. Eine manifest-Datei wird vom VS auch nur dann erstellt, wenn man in den "Projekteigenschaften" unter "Sicherheit" die "ClickOnce-Sicherheitseinstellungen" aktiviert.

    Sonntag, 1. Juni 2014 07:50
  • Hallo norbert3,
    das Manifest wird direkt einkompiliert. D.h. es wird keine 2. Datei benötigt - nur die EXE. Wenn du keine besonderen Anwendungseinstellungen triffst, wird auch kein Manifest angelegt.
    Du kannst zwar die Sicherheitseinstellungen deaktivieren, sobald du das Programm veröffentlichen willst werden sie aber wieder aktiviert. Der Fehler wird also immer kommen.

    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 1. Juni 2014 11:42
    Moderator
  • Sonntagsfrage:

    VisualStudio 2010 / VB.Net / Framework 4.0 / Kompilierung x86

    Muss man das ...exe.manifest mit ausliefern, oder wird alles automatisch in die EXE einkompiliert? Ich denke doch eigentlich letzteres. Hatte bislang immer angenommen, dass VS die Einträge aus der app.manifest dazu verwendet. Eine manifest-Datei wird vom VS auch nur dann erstellt, wenn man in den "Projekteigenschaften" unter "Sicherheit" die "ClickOnce-Sicherheitseinstellungen" aktiviert.

    Sobald das Projekt veröffentlicht wird, werden die Sicherheitseinstellungen für ClickOnce wieder aktiviert, auch wenn ich dieses zuvor abgewählt wurden. Zumindest ist es bei mir so unter VS 2013 Express.
    Sonntag, 1. Juni 2014 11:45

  • Ich würde das Manifest verwenden.

    Würde ich gern auch tun, das mir am einfachsten erscheint. Aber wie du schon geschrieben hast und ich schon selbst festgestellt habe, funktioniert dies unter VS 2013 Express nicht.

    Sonntag, 1. Juni 2014 11:47
  • Eure Antworten verwirren mich jetzt doch etwas.

    Tom schreibt: Der Fehler wird also immer kommen.

    Welchen Fehler meint er?

    Und was bedeutet dies: Sobald das Projekt veröffentlicht wird, werden die Sicherheitseinstellungen für ClickOnce wieder aktiviert

    Geht ihr davon aus, dass man das Programm immer mit ClickOnce veröffentlicht? Aha, ihr bezieht euch auf den Thread-Ersteller? Ich nutze ClickOnce nicht, da es mir zu wenige Einstellmöglichkeiten bietet. Ich benutze (leider) auch nicht den Installer von Microsoft, da er mir viel zu komliziert ist. Andere Installer hab ich auch schon ausprobiert, war aber nie so richtig zufrieden. Korrigiert mich bitte: es ist doch nicht kompliziert zu coden, eine Zip in ein Verzeichnis zu entpacken und die paar Registry-Einträge selbst einzuarbeiten. Ich brauche doch nur den Eintrag unter SOFTWARE und im Uninstall-Zweig. Das Ganze natürlich unter Admin-Rechten. Das frage im Installer ab (Security.Principal.WindowsIdentity.GetCurrent). Meine Software läuft seit Jahren so. Kürzlich kamen mir allerdings mal Zweifel, als die ersten Anwender anfingen, das Prog unter WIN7 zu installieren. Es wurde berichtet, dass nach der Installation der Windows-Explorer öfter mal abschmiert. In diversen anderen Foren war man allerdings der Meinung, dass es an den Registry-Einträgen nicht liegen kann. Könnt ihr mich in dieser Frage auch beruhigen?

    Grüße Norbert


    Sonntag, 1. Juni 2014 15:14
    1. Der TE scheint ClickOnce benutzen zu wollen. Zumindest geht er nicht auf meine Idee mit einem anderen Setuptyp ein.
    2. Sobald das Manifest Adminrechte verlangt, funktioniert ClickOnce nicht mehr. Die dabei erscheinende Fehlermeldung meinte ich.
    3. Ich persönlich habe kein Problem damit ein eigenes Setup zu schreiben. Nur mir ist auch bekannt wie viel man falsch machen kann und wie Aufwendig es ist gegen vorgefertigte Setupprojekte.
      Auch wenn diese weniger Anpassungsmöglichkeiten bieten, haben sie doch ein gewohntes Design und machen alles richtig.
      > Überprüftst du (norbert3) denn ob .NET installiert ist bevor das Programm installiert wird? Wenn nein, sollte es gleich mit installiert werden. etc. etc.
      Es gibt einfach viele Kleinigkeiten die zu beachten sind. Darum würde ich keinem als 1. Weg vorschlagen ein eigenes Setup zu schreiben.
    4. Ich habe mich nach den Anforderungen des TE gerichtet. Somit bin ich nach meiner ersten Antwort bei ClickOnce geblieben.
      Geht ihr davon aus, dass man das Programm immer mit ClickOnce veröffentlicht?

      Ich nicht. Siehe meine erste Antwort.
      Was der TE denkt weiß ich nicht.

    Ich habe alles geschrieben, was ich zur Lösungsfindung weiß. Ich wiederhole mich ungern, wenn man nicht auf mein geschriebenes eingeht.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 1. Juni 2014 15:44
    Moderator
  • >>Ich wiederhole mich ungern (weiss nicht wie man Zitate einfügt)

    Würde mir auch so gehen.

    Bleiben wir nochmal beim Setup. Kannst Du mir noch ein paar Tipps geben? Ob das Framework installiert ist (kommt ab WIN7 eigentlich nicht mehr vor) prüft beim Starten des Setup, das ja unter .Net geschrieben ist, Windows selber. Es kommt ein Hinweis, der aussgekräftig ist. Das Setup wird zwar abgebrochen, aber es kommt zu keinem Absturz. Ich verzichte also bewußt auf diese Überprüfung. Ich habe eine übersichtliche Zahl an Anwendern und ein bisschen mitdenken müssen die schon. Sie bekommen ja auch ein Handbuch, da steht drin, wie ihr Rechner konfiguriert sein muss. Kannst Du Deine etc. etc. noch ein klein wenig mehr aufdröseln? Wäre Dir wirklich sehr dankbar. Oder weisst Du nen Link oder gar Literatur, wo genau erklärt ist, wie man ein Setup erstellen muss? Hab schon überall gesucht, alle Fachbuchhandlungen durchstöbert ...

    Viele Grüße

    Norbert

    Sonntag, 1. Juni 2014 18:05
  • Allerdings würde ich trotzdem das Manifest verwenden, da es der von Microsoft vorgesehene Weg ist.

    Dafür wirst du allerdings auf ein anderes Setupprojekt ausweichen müssen. Da du VS Express verwendest, wird nichts mit VS funktionieren. (Da lediglich die kaufversionen Erweiterungen unterstützen.)

    Ich möchte dir (Tom) jetzt nicht irgendwie zu nahe treten. Aber du hast selbst geschrieben, da ich nur VS Express nutze, kann ich auch nur auf ClickOnce zurückgreifen zum Veröffentlichen?! Da deiner Aussage nach, für meinen Fall, keine anderen Setup-Typen unterstützt werden.

    Wie soll ich da jetzt auf ein anderes Setup-Projekt ausweichen? Ich bin jetzt irgendwie noch mehr verwirrt...

    Sonntag, 1. Juni 2014 18:35
  • Hallo,

    zu Norbert:
    Um zu zitieren kannst du entweder auf "Zitieren" statt auf "Antworten" klicken oder du klickst auf den "HTML"-Button () und fügst an der richtigen Stelle das Zitat mit folgendem Code ein:

    <blockquote>Zitat</blockquote>

    Ich weiß gerade nicht wie die Fehlermeldungvon Windows 7 lautet. Solange du deinen Benutzern zutraust das sie es verstehen und es auch nochmal in der Dokumentation/Hilfe steht, shee ich kein Problem nicht auf die richtige .NET Installation zu prüfen.
    Momentan fallen mir nur 2 weitere Dinge ein, die du beachten solltest:

    1. Das Setup sollte das selbe .NET wie das eigentliche Programm verwenden. Nicht das das Setup 3.5 braucht, die Anwendung aber schon 4.0.
    2. Eine Ordentliche Fehlerbehandlung und ein ordentliches Logging. Falls doch mal etwas schief geht, kann so recht schnell das Problem ermittelt werden. Wenn eine Ordentliche Fehlermeldung ausgegeben wird, können sich viele Benutzer selbst helfen.

    Wenn mir noch etwas einfällt, werde ich das entsprechend hier ergänzen.

    zu Flitzpiepe84:
    Das ist ein Missverständniss. Ich meinte damit, dass die meisten Setuphersteller Visual Studio Erweitern. Da du die Express-Version benutzt, dir aber nichts davon angezeigt wird.
    Das heißt natürlich nicht, das alle Hersteller Visual Studio erweitern.
    VS ist zwar "das große" Programm zum Erstellen von Windowsanwendungen, aber nicht das Einzige. Ich kenne leider kein Setup, was das kann - darum mein Link auf StackOverflow.
    PS: Du trittst mir damit nicht zu nahe - du hast mir nur geschildert, wie du es verstanden hast. Außerdem hätte ich das auch ausführlicher schreiben können - ich nachhinein ist es doch nicht so eindeutig beschrieben.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 1. Juni 2014 19:40
    Moderator
  • Also als kleines Update zur ganzen Sache:

    Mein Problem ließ sich lösen bzw. war eigentlich schon gelöst mit dem Neustart des Programmes als anderer Benutzer. siehe der zweite Link von Tom.

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] CommandLineArgs = Environment.GetCommandLineArgs(); // Befehlszeilenargumente auslesen
        if (CommandLineArgs.Length <= 1 || CommandLineArgs[1] != "restarted") // ist das 2. Argument (das 1. ist immer der Dateipfad) != restarted, wurde das Programm noch nicht neugestartet
        {
            ProcessStartInfo ProcessInfo = new ProcessStartInfo(Application.ExecutablePath, "restarted"); // Prozessinformationen festlegen, Anwendungspfad und unser eigenes Argument "restarted"
            ProcessInfo.Verb = "runas"; // Befehl zum Ausführen als Administrator
            Process.Start(ProcessInfo); // Prozess mit den eingestellten Informationen starten
        }
        else
            Environment.Exit(0); // wurde das Argument "restarted" übergeben, wurde das Programm bereits gestartet, um die Endlosrekursion zu verhindern, nicht erneut aufrufen
    }

    Ich habe dies nur nicht als funktionierend testen können, weil unserer Admin in der Firma mal wieder irgendwas "gedreht" hatte in den Rechten. So dass mein Benutzerkonto von diesem PC aus keine Rechte mehr hatte für dieses Laufwerk. Jetzt geht es jedenfalls.

    Falls jemand dazu Anmerkungen und Verbesserungsvorschläge zum dem Code-Schnippsel hat, wäre ich recht erfreut.

    PS.: Noch einmal recht herzlichen Dank an Tom, ich steh mit C# noch recht am Anfang, weshalb für mich manche Dinge einfach nicht gleich so schlüssig oder selbsterklärend sind


    Montag, 2. Juni 2014 21:40
  • Um ein Programm nicht nochmal zu starten, wenn es bereits läuft, kann man im Studio ein Häkchen setzen bei "SingleInstanz" oder "Einzelinstanz" oder so ähnlich (sitze im Moment nicht an meinem Entwicklungsrechner). Ich weiss nicht, ob dies jetzt beim TS eine Relevanz haben könnte.

    Dienstag, 3. Juni 2014 05:49