8

我正在尝试PSExec从我的 Asp.Net Web 应用程序执行以连接到远程服务器。不知何故,它"Access Denied Error -5"没有设置凭据,而是通过在 PSEXEC 命令中设置凭据来提供 "2250 Network connection could not be found". 我是服务器上的管理员并且我已Windows authentication and Asp.Net Impersonation启用 ( IIS7.5)。更有趣的是,当我尝试从 a 执行此操作时,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但无济于事。

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

4

1 回答 1

2

考虑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类。

于 2013-07-04T02:12:04.180 回答