IIS7 не запускает мой файл Exe с помощью Process Start
Я читал много статей. Но насколько я знаю, я сделал все.
На локальном компьютере VS2010 все работает нормально. Проблема возникает только при работе на сервере IIS7.
Я хочу запустить exe файл, который отлично работает на сервере, если я начну его вручную из проводника Windows.
Dim fiExe As New IO.FileInfo(IO.Path.Combine(diBase.FullName, "ClientBin\ConvertAudio.exe"))
Dim SI As New ProcessStartInfo(fiExe.FullName, args)
SI.Verb = "runas"
SI.UseShellExecute = True
SI.WorkingDirectory = fiExe.Directory.FullName
Dim P As Process = Process.Start(SI)
P.PriorityClass = ProcessPriorityClass.Idle
Я преобразовал каталог ClientBin
в приложение в IIS.
Но при использовании службы я получаю эту ошибку (обратный вызов в приложении Silverlight):
{System.Security.SecurityException ---> System.Security.SecurityException: Sicherheitsfehler
bei System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
bei System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
bei System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
bei System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
bei System.Net.WebClient.WebClientWriteStream.<Dispose>b__3(IAsyncResult ar)}
Я попытался сохранить файл "clientaccesspolicy.xml"
в том же каталоге, что и ClientBin
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
По-прежнему то же сообщение.
Любая идея?
![ISS7 Commandline configuration]()
![permission in Windows Explorer]()
* новая информация - глагол *
При использовании этой функции
Dim startInfo As New ProcessStartInfo(fiExe.FullName)
Dim V As String = ""
For Each verb As String In startInfo.Verbs
V &= V & ", "
Next
Throw New Exception("Verbs=" & V)
Получаю этот результат:
Глаголы =,,,,
* найденное решение *
Я нашел решение, используя http://www.fiddler2.com и http://technet.microsoft.com/en-us/sysinternals/bb896653
Проблема заключалась в использовании приложения x86 в x64 IIS в сочетании с флагом verb=runas
. Теперь для приложения установлено значение anycpu (возможно, это не имеет значения), а verb
в ProcessStartInfo не настроено ни на что.
Ответы
Ответ 1
Edit:
После долгого путешествия я и Nasenbaer нашли следующее.
Возможными причинами отказа IIS от EXE являются:
- Отсутствие разрешений для пользователей IIS, таких как пользователь пула приложений, или служба сети (в IIS6).
- x86 EXE работает на проблемах с процессором x64.
- Типичные проблемы с ошибкой EXE, такие как отсутствующие зависимости.
Оригинальный ответ:
Вам необходимо назначить разрешения безопасности FullControl для пользователя IIS AppPool\DefaultAppPool
в каталоге, в котором находится EXE. Это пользователь, который пытается запустить процесс (при условии, что вы используете DefaultAppPool
), и без правильные разрешения, он не может этого сделать.
При запуске EXE вручную вы используете пользователя Windows. Вот почему вы можете пообедать в ручном режиме. IIS использует пользователя пула приложений.
Чтобы добавить разрешения, выполните следующие действия:
- Перейти к свойствам каталога
- вкладка "Безопасность"
- Изменить.. → Добавить
IIS AppPool\DefaultAppPool
- Проверьте его
FullControl
Скриншот
![enter image description here]()
![enter image description here]()
Ответ 2
Что мне помогло:
Настройка в пуле приложений
Identity = LocalSystem
- Открыть пулы приложений
- Найдите свой пул (по умолчанию DefaultAppPool)
- Нажмите "Дополнительные настройки"
- Изменить идентификатор на "LocalSystem"
Надеюсь, это поможет кому-то...
Ответ 3
var p = new Process
{
StartInfo =
{
FileName = Path,
UseShellExecute = false,
}
};
p.Start();