VB.net Powershell Script mit Admin-Rechte starten

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von michib82.

    VB.net Powershell Script mit Admin-Rechte starten

    Hallo liebe VB-Paradise Mitglieder,

    ich habe leider eine Problemstellung an der ich schon einige Zeit arbeite und auch nach zahlreichen Foren- und Internet-Recherchen sowie das Konsumieren des Inhalts zahlreicher Kaffeetassen hat mich keiner Lösung näher gebracht. Ich hoffe daher, nachdem ich entweder keinen Eintrag im Forum hierzu gefunden habe bzw. ähnliche Einträge nicht geholfen haben, das mir über diesen neuen Eintrag jemand weiterhelfen kann - vielen lieben Dank für jeden Lösungsvorschlag!

    Es geht um folgendes, ich hab ein Programm in VB.net geschrieben (welches als Administrator ausgeführt wird) und ein Batchfile aufruft. Dieses wiederrum ruft ein Powershell-Scipt auf.
    Das Programm wird auf einem Rechner mit Windows Server 2012 R2 ausgeführt.

    In der app.manifest ist folgende Zeile eingetragen (wurde auf requireAdministrator geändert):

    VB.NET-Quellcode

    1. <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />


    Die Aufrufe sind so aufgebaut

    VB.net Programm
    '- (VB.net erstellt) Batchdatei
    '- (Batchdatei ruft auf:) Powershell


    Nun zur Problemstellung, das VB.net Programm startet nach der UAC Abfrage mit Admin-Rechte. In diesem Programm werden Einstellungen gesetzt die dann im Batchfile bzw. Powershell-Script übernommen werden. Wenn ich das Batchfile mit "Run as Administrator" aus dem Explorer heraus aufrufe funktioniert das Powershell-Script. Wenn ich das Batchfile allerdings aus dem VB.net Programm - welches ja mit Admin-Rechte gestartet wurde - heraus starte erhalte ich die Meldung, dass z.B. "add-windowsfeature" nicht bekannt ist.

    VB.net Programm
    '- (VB.net erstellt) Batchdatei --> mit "Run as Administrator" ---> Ausführung des Powershell-Scripts funktioniert
    '- (Batchdatei ruft auf:) Powershell (ebenfalls vom VB.net Programm erstellt)

    VB.net Programm
    '- (VB.net erstellt) Batchdatei --> mit VB.net ausgeführt ---> Ausführung des Powershell-Scripts funktioniert NICHT
    '- (Batchdatei ruft auf:) Powershell (ebenfalls vom VB.net Programm erstellt)

    Um das Batchfile auszuführen verwende ich folgenden Code:

    VB.NET-Quellcode

    1. Dim process As System.Diagnostics.Process = Nothing
    2. Dim processStartInfo As System.Diagnostics.ProcessStartInfo
    3. processStartInfo = New System.Diagnostics.ProcessStartInfo
    4. processStartInfo.FileName = "cmd.exe"
    5. processStartInfo.Verb = "runas"
    6. processStartInfo.Arguments = "/C " & sBatchFilePath
    7. processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
    8. processStartInfo.UseShellExecute = True
    9. Try
    10. process = System.Diagnostics.Process.Start(processStartInfo)
    11. Catch ex As Exception
    12. MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    13. Finally
    14. If Not (process Is Nothing) Then
    15. process.Dispose()
    16. End If
    17. End Try


    Ich verstehe nur nicht, warum es mit Batchfiles -> Run as Administrator funktioniert und aus dem VB.net Programm nicht? ?( ?( Ich vermute ein Zugriff/Rechte Problem nachdem es ja mit Run as Administrator funktioniert.

    Wenn ich jedoch processStartInfo.Username/Password/Domain setze funktioniert es. Für mich ergibt das aber keinen Sinn - das VB.net Programm ist ja bereits mit Admin-Rechte gestartet und "Run as Administrator" fragt ja auch nicht nach den Benutzerdaten.

    Hier noch der Aufbau des Batchfiles:

    Quellcode

    1. @echo off
    2. echo Starting script for installation/configuration at %date% %time%
    3. echo Starting script for installation/configuration at %date% %time% >> "$_outputpath\$_PowershellLog"
    4. Powershell.exe -file "$_outputpath\$_PowershellScript" >> "$_outputpath\$_PowershellLog"
    5. echo Script finished at %date% %time% >> "$_outputpath\$_PowershellLog"
    6. pause


    Ich habe auch schon "PowerShell.exe -ExecutionPolicy Bypass -File ...." versucht jedoch hilft das auch nichts.
    Es betrifft aber wohl nur die Powershell Commands bei denen die Konfiguration des Computers geändert wird (also die Verwendung von add-windowsfeature, New-RDSessionCollection, Add-RDServer usw.).
    Das Powershell-Script hat aber keine Probleme auf die Registry des Rechners zuzugreifen (ändern/schreiben).

    Das VB.net Programm sowie das Batchfile und Powershell Script werden alle lokal ausgeführt. Ein Zugriffsproblem auf einem entfernten Rechner kann daher ausgeschlossen werden.

    Wie gesagt, ich stehe da leider an mit meinem Wissensstand - natürlich wäre es eine Möglichkeit über ein zusätzliches Forumlar die Benutzerdaten abzufragen, da das Programm aber eben bereits mit Admin-Rechte läuft werden sich die Benutzer wohl sehr wundern - und ärgern, da ein Feature installiert und - nach einem Neustart - konfiguriert werden muss. Das passiert beides über den Aufruf aus dem VB.net Programm heraus mit dem Batchfile bzw. Powershell-Script.

    Ich möchte mich nochmals schonmal vorab bei allen herzlich bedanken die Hilfe anbieten!

    Liebe Grüße
    michi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „michib82“ ()

    OK Problem gefunden, einige Powershell Commands sind wohl nur auf der 64 bit Version verfügbar, wie z.B. add-WindowsFeature etc.

    Lösung:
    - Umschalten der Zielplattform von x86 auf x64
    - mscorlib.dll wird als warnung angezeigt -> warnung ignorieren (da mscorlib.dll wohl an x86 angepasst ist)
    - Batchfile geändert (vollständiger Pfad angegeben):

    Quellcode

    1. %windir%\System32\WindowsPowerShell\v1.0\Powershell.exe -file "$_outputpath\$_PowershellScript" >> "$_outputpath\$_PowershellLog"


    Nun funktioniert der Aufruf - auch ohne Angaben der Benutzerdaten.

    Vom VB.net (Plattform x86) Programm wird folgende Powershell aufgerufen: %windir%\syswow64\windowspowershell\v1.0\powershell.exe
    Wenn man das Batchfile mit "Run as Administrator" bzw. VB.net (Plattform x64) ausführt wird folgendes ausgeführt: %windir%\System32\WindowsPowerShell\v1.0\powershell.exe