Unlogisches Problem "Process.start"

  • VB.NET
  • .NET (FX) 4.0

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Unlogisches Problem "Process.start"

    Hallo Leute,

    bin heute mal wieder mit einer Frage auf eure Hilfe angewiesen.
    Ich erstelle gerade eine Applikation, welche per Befehlszeile Argumente entgegennimmt und danach dieses Argument als Datei mit Berechtigungen eines Administrators
    startet. Allerdings will das "Process.start" nicht klappen.

    So sieht der source aus:

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Imports System.Windows.Forms
    3. Imports System.Reflection
    4. Public Class Form1
    5. Public hostname As String
    6. Public passwd As String = "123456789"
    7. Public procname As String
    8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. ExecuteParams()
    10. End Sub
    11. Public Sub ExecuteParams()
    12. Dim args As String()
    13. args = Environment.GetCommandLineArgs()
    14. For i As Integer = 1 To args.Length - 1
    15. Select Case args(i).ToLower
    16. Case "?", "help", "hilfe"
    17. MsgBox("Bitte verwenden Sie als Parameter die zu startende ausführbare" & vbNewLine & "Datei! Dies kann eine *.bat, *.exe, *.msi oder *.pif Datei sein!",MsgBoxStyle.Question, "Hilfe zu runasadmin")
    18. Application.Exit()
    19. Case "info"
    20. 'info
    21. Application.Exit()
    22. Case Else
    23. procname = args(i)
    24. End Select
    25. Next
    26. If procname.Contains(".") Then
    27. Dim pfad As String = Application.StartupPath & procname 'System.IO.Path.Combine([Assembly].GetExecutingAssembly.Location, procname)
    28. Dim p As New ProcessStartInfo(pfad)
    29. p.UseShellExecute = False
    30. p.WindowStyle = ProcessWindowStyle.Hidden
    31. p.Domain = System.Net.Dns.GetHostName()
    32. p.UserName = "Administrator"
    33. p.Password = New System.Security.SecureString()
    34. For Each c As Char In passwd
    35. p.Password.AppendChar(c)
    36. Next
    37. Try
    38. Process.Start(p)
    39. Application.Exit()
    40. Catch ex As Exception
    41. MsgBox("Fehler " & ex.Message)
    42. End Try
    43. Else
    44. Application.Exit()
    45. End If
    46. End Sub



    Die Process.start Prozedur habe ich bereits einige Male geändert, folgendes habe ich ebenfalls ausprobiert:
    (Leider ohne Erfolg)

    VB.NET-Quellcode

    1. Dim p As New ProcessStartInfo(pfad)
    2. p.UseShellExecute = False
    3. p.WindowStyle = ProcessWindowStyle.Hidden
    4. p.WorkingDirectory = Application.StartupPath

    bzw.
    • p.WorkingDirectory = "C:\"
    • p.WorkingDirectory = "C:"
    • p.WorkingDirectory = Application.StartupPath & procname
    • p.WorkingDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location)

    VB.NET-Quellcode

    1. p.Domain = System.Net.Dns.GetHostName()
    2. p.UserName = "Administrator"
    3. p.Password = New System.Security.SecureString()
    4. For Each c As Char In passwd
    5. p.Password.AppendChar(c)
    6. Next
    7. Try
    8. Process.Start(p)
    9. Application.Exit()
    10. Catch ex As Exception
    11. MsgBox("Fehler " & ex.Message)
    12. End Try


    In jedem Fall bekomme ich als Fehlermeldung "Der Verzeichnisname ist ungültig" zurück oder "Das System kann den angegebenen Pfad nicht finden." Getestet habe ich jeweils eine .exe und eine .bat Datei die im gleichen Folder der Applikation liegen. Teste ich allerdings mspaint.exe
    oder Notepad.exe klappt es ohne Probleme (vermutlich wegen enviroment variables). Ich möchte aber die eigene .exe bzw .bat auch
    ordnungsgemäß starten können.

    Kann mir jemand sagen wie oder warum das nicht funktioniert :S X/

    Danke euch vielmals,
    Gruß!

    v-go schrieb:

    "C:\"
    Probier mal "C:\Temp\".
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    v-go schrieb:

    "C:\"
    Probier mal "C:\Temp\".

    Danke für deine Antwort, habe ich probiert - leider gleiches Ergebnis :(

    ErfinderDesRades schrieb:

    Ich kann mir nur vorstellen, dasses daran liegt, dass der Verzeichnisname ungültig ist.

    Das gibt die ex.message auch aus, weiß aber nicht warum. Wenn ich pfad in eine Msgbox ausgeben lasse, passt der Pfad!
    ja, normal, wenn sone Message ausgegeben wird, stimmt die auch, aber das Problem sitzt ca. 70cm vorm Bildschirm auf der Leitung. ;)

    Am besten übrigens du entfernst den Trycatch, dann kannst du viel differenzierter debuggen, erhälst zB. direkte Einsicht in die p-Variable, kannst die zB auskopieren, und hier posten, und wir überlegen, warum der Verzeichnisname ungültig ist.
    Hast du eine Idee wie ich Befehlszeilenargumente im Debugger simulieren kann ? X/

    Hier mal die Results von P, wenn ich die variable procname befülle mit "test.exe"

    Bilder
    • debugresults.png

      12,89 kB, 587×292, 1.342 mal angesehen

    v-go schrieb:

    im Debugger simulieren
    Projekt => Eigenschaften => Debug
    Command line arguments (meiner spricht englisch).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für den Tipp, so lernt man dazu.
    Allerdings gleiche Fehlermeldung, gleiches Ergebnis:



    Workingdirectory habe ich entfernt in diesem Fall allerdings.

    @ErfinderDesRades leider auch mit Pfad gleicher Fehler:



    Ja genau so lauten die Fehlermeldungen.
    Ich komme der Sache schon näher, bis jetzt war es so dass ich das Release aus obigen Code aus einem Netzlaufwerk bzw. nur aus dem Debugger aus ausgeführt habe. Führe ich diese nun von einem lokalen Laufwerk direkt aus, also zb. E: klappt es einfach. Unlogisch ist mir immer noch, warum es dann nicht vom Share oder im Debugger funktioniert ?
    ja, ich hab sie ja auskopiert.
    Meine Frage ist aber, welche der beiden?
    Denn in meiner Welt kommt zu einem Fehler immer nur eine Fehlermeldung.

    Ich tippe ja auf ein Rechte-Problem.
    Also du könntest versuchen, den Fehler absichtlich zu provozieren, indem du das Prog mal als Admin, mal als Standard-User ausführst. Wenn dann der Fehler auftritt, dann weißt du zumindest, worans liegt.
    Danke für deine Antworten und deine Hilfsbereitschaft.
    Die Fehlermeldung lautet im Moment "Der Verzeichnisname ist ungültig". Tritt bei Standarduser und Adminuser auf, hatte ich vorhin schon probiert.
    Das Problem besteht wie oben beschrieben explizit wenn ich die executable von einem networkshare aus mit der kommandozeile aufrufe. Komischerweise tritt es
    auch im Debugger auf. Sobald ich aber die executable auf einer lokalen Partition ausführe funktioniert die Anwendung wunderbar und genauso, wie sie soll... :/

    v-go schrieb:

    Fehlermeldung
    Kannst Du einen kleinen Quellcode posten, der den Effekt reproduzioert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!