Dateiberechtigung mit Setup Project ändern - geht das ?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von doLob.

    Dateiberechtigung mit Setup Project ändern - geht das ?

    Guten Abend,
    Ich bin im Tunnel und finde allein wohl nicht raus.
    Kurze Zusammenfassung:
    Ich habe ein GUI vb.net Project erstellt, welches mir ein externes Konsolenprogramm ausführt und die Ausgabe zur Anzeige bringt. Das funktioniert auch alles bestens.
    Nun habe ich ein Installer Project hinzugefügt, welches mir die Applikation im Windows\Programme Ordner installiert. Das funktioniert auch. ABER.:
    Das externe Programm, welches sich auch im Verzeichnis befindet liest Daten aus einer *.cfg Datei ein, welche vorher durch meine Applikation erstellt wird und akzeptiert nur
    das eigene Verzeichnis als Speicherort für die *.cfg. Jetz begann mein UAC Problem. Ich möchte die App. nicht als admin ausführen. Da ich beim experimentieren festgestellt habe,
    dass ich nach manuellen Anpassen der Rechte über den Explorer für diese *.cfg wieder ohne Probleme damit arbeiten kann suche ich nach einem Weg, nun beim
    Setup, das ich ja mit admin Rechten ausführe, der *.cfg die Rechte zu erteilen. *.vbs mit icacls funzt zwar im Project-Verzeichnis aber nicht beim Setup.

    Quellcode

    1. set oShell = CreateObject("WScript.shell")
    2. oShell.run "icacls application.cfg /grant Jeder:(F)"

    oder auch so mit neuem erstellen:

    Quellcode

    1. dim filesys, text, readfile
    2. set filesys = CreateObject("Scripting.FileSystemObject")
    3. Set text = filesys.CreateTextFile("application.cfg")
    4. text.Write "Schreibtest"
    5. text.close
    6. set readfile = filesys.GetFile("application.cfg")
    7. If Not readfile.Attributes And 0 Then
    8. ...
    9. Else
    10. ...
    11. End If

    Freue mich auch über jeden anderen Ansatz.

    Gru0 doLob
    Lege die Config-Datei einfach in diesen SpecialFolder CommonApplicationData ab. Da solltest Du keine Probleme bekommen.
    In den SpecialFolders Programs und ProgramsX86 darf man aus einer Anwendung heraus keine Daten ablegen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Eine einfache Lösung könnte das setzen des Arbeitsverzeichnis für die Consolenanwendung sein. Wenn du die Consolenanwendung über die Process Klasse startest kannst du das über StartInfo.WorkingDirectory tun. Dann würde die Consolenanwendung die *.cfg in dem von dir vorgegebenen Pfad suchen.

    Spoiler anzeigen

    C#-Quellcode

    1. // Speichert die *.cfg Datei unter: %LocalAppData%/NameDerAnwendung/NameDerAnwendung/Version/HalloWelt.cfg
    2. System.IO.File.WriteAllText(System.IO.Path.Combine(Application.LocalUserAppDataPath, "HalloWelt.cfg"), "Hallo Welt...");
    3. using (System.Diagnostics.Process p = new System.Diagnostics.Process())
    4. {
    5. p.StartInfo = new System.Diagnostics.ProcessStartInfo()
    6. {
    7. FileName = "TestConsole.exe",
    8. RedirectStandardOutput = true,
    9. UseShellExecute = false,
    10. WorkingDirectory = Application.LocalUserAppDataPath // Setzt das Arbeitsverzeichnis des Prozesses: %LocalAppData%/NameDerAnwendung/NameDerAnwendung/Version/
    11. };
    12. // ...
    13. }

    @-Franky-
    Sah gut aus. Hat bisher aber auch noch nicht gekpappt. Wie bei allen anderen versuchen kann ich die Codes nutzen, wenn ich meine Anwendung als Admin starte. Während der Ausführung des "Setup-Projects", was ja nach
    UAC als Admin ausgeführt wird, ist es mir noch nicht gelungen über die "Benutzerdefinierten Aktionen -> Install" eine *.vbs oder auch *.exe auszuführen die die Anpassungen der Rechte der *.cfg- Datei anpasst.
    Selbst von der Admin CMD lassen sich die EXE oder VBS starten und machen was ihnen aufgetragen wurde.

    @INOPIAE
    Lege die Config-Datei einfach in diesen SpecialFolder CommonApplicationData ab

    Geht nicht. Bei der als process gestarteten Konsolenanwendung gibt es nicht die Möglichkeit den Speicherort der Konfigurationsdatei als Parameter zu übergeben. Das selbe Verzeichnis wird vorrausgesetzt.
    wird keine CFG gefunden, werden Standardwerte benutzt.

    @Fakiz
    das über StartInfo.WorkingDirectory tun

    Auch das habe ich heute leider erfolglos probiert. Das geht nur, wenn ich das Konsolenprogramm auch dorthin verbanne.

    PS .... auch StartInfo.Verb="runas" habe ich noch gecheckt. Ohne Erfolg.

    Wenn ich meine Anwendung immer Zwangsläufig
    So. da es mir nicht gelungen ist, während des setup's eine, was auch immer geartete ausführbare Datei (vbs, exe), zum starten zu bewegen, habe ich das Problem, für mich akzeptabel,
    wie folgt gelöst.

    1. das Setup Projekt erzeugt einen registry-Key "ErstStart" den ich auf "0" setze. ( das klappt hervorragend ).
    2. Während des ersten Programmstarts wird dieser abgefragt und wenn er "0" ist wird die Konsolenanwendung "CreateCFG.exe" mit admin-Rechten gestartet und der Reg-Key auf "1" gesetzt.
    Dann muss ich nur noch dieses eine mal die UAC-Abfrage bestätigen und meine *.cfg wird mit vollen Rechten für den aktuellen Nutzer im C:\Programme\Anwendung Verzeichnis erstellt.
    Jetzt kann die Anwendung mit Benutzer-Rechten die *.cfg in diesem Ordner editieren und der dann gestartete Prozess findet sie auch und kann sie nutzen.

    Soltte jemand noch eine Idee haben, wie ich das während des Setups realisieren kann , -gerne Mitteilen.
    Ich will auch nochmal alternativen prüfen. Habe noch von früher irgendwo WiX.

    Gruß doLob