Выполнить скрипт, используя 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.