2013-03-04 14 views
7

Ich führe einen ausführbaren Prozess aus meiner ASP.NET-Anwendung, wenn ein Benutzer auf eine Schaltfläche klickt. Dieser Prozess erstellt mehrere Dateien und stellt sie dem Endbenutzer zur Verfügung. Ich kann nicht wirklich sehen, was der Prozess ist oder nicht tut, aber es hat nicht funktioniert, bis ich den Admin-Benutzer als Anwendungspool-Identität auf dem Server angegeben. Ich verwende IIS7.Ausführungsbefehl von ASP.NET App Pool Identität

using (var proc = new Process()) 
{ 
    proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyExe.exe"); 
    proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFilePath); 
    proc.StartInfo.UseShellExecute = true; 
    proc.Start(); 
    proc.WaitForExit(); 
} 

Ich gehe davon aus, dass dies in der Regel eine schlechte Sache zu tun ist. Können Sie mir einen Einblick geben, was zu tun ist, um dies für das normale ApplicationPoolIdentity Konto zu ermöglichen?

Danke!

+0

Wie liefert der Prozess Dateien an den Endbenutzer? –

+0

Es wird in einem temporären Verzeichnis gespeichert, alle Dateien werden komprimiert und angezeigt. Das funktioniert schon. – daniel

Antwort

1

Vielen Dank für Ihre Hilfe. Alles, was ich tun musste, war, das StartInfo.WorkingDirectory auf eine Stelle zu setzen, die ich schreiben konnte.

 using (var proc = new Process()) 
     { 
      proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyEXE.exe"); 
      proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFile); 
      proc.StartInfo.WorkingDirectory = savePath; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 

Dies bewirkt, dass die temporären Dateien zu einem Nicht-Systemordner geschrieben werden und somit keine erhöhten Berechtigungen für den Anwendungspool muss.

2

Es ist wahrscheinlich ein Problem mit Datei/Ausführungsberechtigungen. Versuchen execute Berechtigungen für die Application zu ~/Testing/Dema/MyExe.exe und read Berechtigungen commandFilePath gewähren. Sie haben erwähnt, dass Ihr Prozess Dateien erstellt. Sie müssen dem ApplicationPoolIdentity für den Ordner, in dem die Dateien erstellt werden, entweder modify oder full control Berechtigungen erteilen. Hier ist eine Matrix list of permissions.

Siehe assign permissions to ApplicationPoolIdentity account Informationen über Berechtigungen zu gewähren.

Das Sicherheitsereignisprotokoll sollte die Erlaubnis erfassen Fehler verweigert. Überprüfen Sie dort, ob Sie Probleme mit der Zugriffsberechtigung haben. Die System- und Anwendungsprotokolle enthalten möglicherweise auch Informationen zu dem Problem.

Process Explorer kann auch Dateizugriffsanforderungen anzeigen. Hier ist ein Technet-Artikel unter troubleshooting with Process Explorer.

+0

Einverstanden. Der Schreibort funktioniert schon gut ... es sind die Ausführungsrechte. Wie würde ich die ApplicationPoolIdentity ändern, um Ausführungsberechtigungen zu erhalten? – daniel

+0

Es verwendet das IUSR-Konto ... und dieses Konto hat volle Berechtigungen für das Verzeichnis. Muss ich noch tun, was in diesem Thread erwähnt wird? – daniel

+0

Sie können ProcessExplorer starten, dann den Apppool unter einem Administratorkonto ausführen und alle Aktivitäten protokollieren (über ProcessExplorer), wenn die Anwendung erfolgreich ausgeführt wird. Wechseln Sie dann zur Ausführung unter dem IUSR-Konto und vergleichen Sie die ProcessExplorer-Protokolle. –

3

Zuerst, warum Sie die Shell benötigen, um es auszuführen? Ist keine Konsolenanwendung - Öffnen Sie ein Fenster?

Zweitens müssen Sie die Eingabe und die Ausgabe umleiten.

Und letzte, was Sie tun müssen, ist auf das Verzeichnis zu setzen, die das Skript ausgeführt wird, die Erlaubnis für den Benutzer unter Hexe Ihren Pool ausgeführt wird. Und entferne den Admin aus deinem Pool.

proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.CreateNoWindow = false; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.StartInfo.RedirectStandardInput = true; 

proc.Start(); 

proc.StandardInput.Flush(); 
proc.StandardInput.Close(); 

proc.WaitForExit(); 
proc.Close(); 

So zum Beispiel, wenn Sie Ihren Pool hinzufügen unter dem UserA laufen, dann gehen Sie zu Ihrem Verzeichnis, das Ihr Programm läuft und die Erlaubnis, Programme für die UserA in der Lage gewesen hinzufügen auf diesem Verzeichnis auszuführen. Wenn Ihr Programm auch andere Verzeichnisse zum Lesen und Schreiben verwendet, fügen Sie dem Benutzer auch eine Berechtigung für diese hinzu.

ich nicht wirklich sehen kann, was der Prozess ist oder nicht tun

Sie einen Blick darauf werfen können, wenn Sie die Process Explorer auf dem Server verwenden und sehen, ob seine Läufe, wenn die enge, Wenn es aufhört, bleib aber dort.

+0

Ich sehe den Prozess für eine Sekunde ausgeführt und dann beendet ... Ich nehme an, fehlende Berechtigungen. – daniel

+0

@daniel Wenn du es startest, dann sind keine Berechtigungen auf dem Lauf. Fügen Sie einige Logs in Ihre Anwendung ein, um herauszufinden, warum Stop angezeigt wird. – Aristos

+0

Haben Sie jemals einen Befehl ausgeführt, der besagt, dass Sie "als Administrator ausführen" müssen? Der Prozess wird möglicherweise noch gestartet, kann jedoch möglicherweise ohne erweiterte Berechtigungen keine weiteren Aktionen ausführen. – daniel

1

Jedes Mal, wenn Sie einen Vorgang von einer ASP.NET-Seite ausführen, wird es unter dem Sicherheitskontext des Arbeitsprozesses, das Privileg des App Poolkontos. Es ist nicht so, als würden Sie die MyExe.exe normalerweise ausführen. In diesem Fall wird es mit dem angemeldeten Konto ausgeführt. Aus diesem Grund hat Ihr Code funktioniert, als Sie dem App-Pool ein Administratorkonto zugewiesen haben.

Es gibt viele Möglichkeiten, dieses Problem zu lösen.

Einer der einfachsten wäre es, Ihre App-Pool-Identität zu Network Service zu ändern und den Netzwerkdienst den Berechtigungen der Ordner hinzuzufügen, in denen MyExe.exe auf das Formular zugreifen wird.

Ich hoffe, es hilft.

+0

Der Netzwerkdienst gewährt keinen Zugriff auf das inetsrv-Verzeichnis. – daniel