从Asp中使用sysinternals PSExec执行脚本.Net Web应用程序

本文关键字:脚本 执行 Net Web 应用程序 PSExec sysinternals Asp | 更新日期: 2023-09-27 18:11:45

我正试图从我的Asp执行PSExec。Net Web应用程序连接到远程服务器。不知何故,它给出了没有设置凭据的"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,但无济于事。

谢谢你的帮助。我试着查找类似的问题,但找不到解决问题的方法。

从Asp中使用sysinternals PSExec执行脚本.Net Web应用程序

考虑将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),可能需要允许机器委派身份。如果您知道机器将连接到的SPN,则可以使用受约束的委托,但在许多情况下,如果事先不知道目标,则有必要允许不受约束的委托。


注意:如果您远程到计算机只是为了运行ipconfig,您可以通过WMI获得相同的信息,而不必尝试将STDOUT输出返回给调用计算机。看一下Win32_NetworkAdapterConfiguration类。