Запрещен доступ к процессу запуска с веб-сайта ASP.NET - PullRequest
4 голосов
/ 05 апреля 2019

У меня есть веб-сайт ASP.NET MVC4, где я пытаюсь выполнить процесс на сервере. Код выглядит следующим образом:

ProcessStartInfo startInfo = new ProcessStartInfo()
{
    FileName = ExeLocation,
    Arguments = string.Format("\"{0}\"{1}", ScriptLocation, Arguments),
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    WorkingDirectory = AppDir,
    CreateNoWindow = true,
    UserName = ExeUsername,
    Password = ExePassword,
    Domain = ExeDomain
};

using (Process process = Process.Start(startInfo))
{
    using (StreamReader reader = process.StandardOutput)
    {
        output = reader.ReadToEnd();
    }
    using (StreamReader reader = process.StandardError)
    {
        error = reader.ReadToEnd();
    }
    process.WaitForExit();
    if (process.ExitCode != 0)
    {
        throw new Exception(string.IsNullOrEmpty(output) ? error : output);
    }
}

Это прекрасно работает на моем локальном компьютере в Visual Studio, но при развертывании на моем сервере (W2K12) я получаю следующую ошибку:

Access is denied   
at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)

У меня есть учетная запись, на которую ссылается ExeUsername в обеих группах Администраторы и IIS_IUSRS на сервере.

Пул приложений работает как другая учетная запись (следовательно, необходимо назначить определенную учетную запись для запуска процесса), которая также является членом группы администраторов и IIS_IUSRS на сервере.

Когда я захожу на сервер и запускаю командную строку как ExeUsername, я могу выполнить процесс, поэтому проблема должна быть связана с выполнением из IIS.

Что еще может блокировать этот доступ?

Ответы [ 3 ]

0 голосов
/ 11 апреля 2019

Я бы попробовал другой подход. Сначала выдать себя за пользовательского пользователя (тот, у которого есть разрешение на запуск команды), а затем запустить процесс в контексте олицетворенного пользователя:

SafeAccessTokenHandle safeAccessTokenHandle;  
bool returnValue = LogonUser(ExeUsername, ExeDomain, ExePassword,  
        LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,  
        out safeAccessTokenHandle);

if (false == returnValue)  
{  
    int ret = Marshal.GetLastWin32Error();  
    throw new System.ComponentModel.Win32Exception(ret);  
}  

WindowsIdentity.RunImpersonated(safeAccessTokenHandle, () =>  
{  
     var startInfo = new ProcessStartInfo()
     {
         FileName = ExeLocation,
         Arguments = string.Format("\"{0}\"{1}", ScriptLocation, Arguments),
         UseShellExecute = false,
         RedirectStandardOutput = true,
         RedirectStandardError = true,
         WorkingDirectory = AppDir,
         CreateNoWindow = true,
         UserName = ExeUsername,
         Password = ExePassword,
         Domain = ExeDomain
     };

     using (Process process = Process.Start(startInfo))
     {
         using (StreamReader reader = process.StandardOutput)
         {
             output = reader.ReadToEnd();
         }

         using (StreamReader reader = process.StandardError)
         {
             error = reader.ReadToEnd();
         }

         process.WaitForExit();
         if (process.ExitCode != 0)
         {
             throw new Exception(string.IsNullOrEmpty(output) ? error : output);
         }
     } 
);  

И метод LogonUser выглядит так:

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]  
public static extern bool LogonUser(String lpszUsername, String lpszDomain, 
String lpszPassword, int dwLogonType, int dwLogonProvider, 
out SafeAccessTokenHandle phToken);

Подробнее о подражании в .NET можно узнать здесь: https://docs.microsoft.com/en-gb/dotnet/api/system.security.principal.windowsidentity.runimpersonated?view=netframework-4.7.2

0 голосов
/ 18 апреля 2019

Может быть, это поможет вам.

ProcessStartInfo startInfo = new ProcessStartInfo()
{
   //...
   UseShellExecute = true,                
   Verb = "runas"
};

Если вы получили ошибку, вы можете проверить это также.

0 голосов
/ 11 апреля 2019
  1. Щелкните правой кнопкой мыши пул приложений
  2. Нажмите на дополнительные настройки
  3. Личность
  4. Пользовательский аккаунт
  5. Установить имя пользователя и пароль

Если у вас есть домен, будьте осторожны, используйте домен \ имя пользователя для имени пользователя
а также доступ к папке развертывания.

...