Выполнить скрипт, используя sysinternals PSExec из веб-приложения Asp.Net

Я пытаюсь казнить PSExec из моего веб-приложения Asp.Net для подключения к удаленному серверу. Как-то это дает "Access Denied Error -5" без установленных учетных данных и путем установки учетных данных в команде PSEXEC это дает "2250 Network connection could not be found", Я админ на сервере и у меня есть Windows authentication and Asp.Net Impersonation включен (IIS7.5). Более интересно, когда я пытаюсь выполнить это из console application или даже просто используя command prompt это просто отлично работает. Я пытаюсь сделать только операцию ping в качестве теста.

Вот мой фрагмент кода:-

            var startInfo = new ProcessStartInfo{
                CreateNoWindow = true,
                UseShellExecute = false,
                FileName = FilePath,
                Arguments = CommandArgs
            }

            Process vsCommandProcess = Process.Start(startInfo);

            vsCommandProcess.WaitForExit();
            var exitCode = vsCommandProcess.ExitCode;
            if (vsCommandProcess.ExitCode != 0)
            {
                ...rest of the code

Вот:-

FilePath --> C:\pstools\psexec.exe
Arguments --> \\servername -accepteula -u domain\userName -p password ipconfig (1)
               \\servername -accepteula ipconfig (2)         

(1) Gives Error 2250 (2) gives Error 5

Та же команда и код работают с консольным приложением. Поэтому я считаю, что это определенно связано с приложением Asp.net, которое не может перенести учетные данные на удаленный компьютер. Я событие попробовал startInfo.LoadUserProfile но безрезультатно.

Ценю твою помощь. Я пытался найти похожие вопросы, но не смог найти решение проблемы, с которой столкнулся.

1 ответ

Рассмотреть возможность принятия psexec вне процесса. Переход к WMI напрямую может дать более полное представление о том, что происходит не так:

var connOpts = new ConnectionOptions()
{
// Optional, default is to use current identity
    Username = "username",
    Password = "password"
};

// create a handle to the Win32_Process object on the remote computer
ManagementScope mgmtScope = new ManagementScope(@"\\servername\root\cimv2", connOpts);
ManagementClass w32Process = new ManagementClass(mgmtScope, 
    new ManagementPath("Win32_Process"), new ObjectGetOptions());

// create the process itself
object[] createArgs = new object[] {
    // [in]   string CommandLine,
    "notepad.exe", 
    // [in]   string CurrentDirectory,
    null, 
    // [in]   Win32_ProcessStartup ProcessStartupInformation,
    null, 
    // [out]  uint32 ProcessId
    0};

var result = (int)w32Process.InvokeMethod("Create", createArgs);

switch (result)
{
    case 0: /* no-op, successful start */ break;
    case 2: throw new Exception("Access Denied");
    case 3: throw new Exception("Insufficient Privilege");
    case 8: throw new Exception("Unknown failure");
    case 9: throw new Exception("Path not found");
    case 21: throw new InvalidOperationException("Invalid Parameter");
}

Если вы по-прежнему сталкиваетесь с проблемами подражания, может быть полезно сбросить содержимое HttpContext.Current.User.Identity чтобы убедиться, что IIS настроен правильно. Кроме того, если вы используете Kerberos (через Negotiate/SPNEGO), вам может потребоваться разрешить компьютеру делегировать удостоверение личности. Если вы знаете имя участника-службы, к которому будет подключаться компьютер, вы можете использовать ограниченное делегирование, но во многих случаях необходимо разрешить неограниченное делегирование, если цели не известны заранее.


Примечание: если вы выполняете удаленное взаимодействие с компьютером только для запуска ipconfig, вы можете получить ту же информацию через WMI, не беспокоясь о попытке получить STDOUT вывод обратно на вызывающий компьютер. Взгляните на класс Win32_NetworkAdapterConfiguration.

Другие вопросы по тегам