0

我正在尝试创建一个可以终止终端服务器上用户会话的应用程序。我写了以下代码:

string host = "terminalServer";
string user = "domain\criso";
string sid = "4";

System.Diagnostics.Process proc = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();

startInfo.CreateNoWindow        = true;
startInfo.FileName              = @"logoff.exe";
startInfo.Arguments             = @"/SERVER:" + host + " " + sid;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute       = false;
proc.StartInfo                  = startInfo;
proc.Start();
proc.WaitForExit();

// Catch error
if (proc.ExitCode != 0)
{
    StreamReader reader = proc.StandardError;
    string errorMessage = reader.ReadToEnd();

    MessageBox.Show(@"ERROR " + proc.ExitCode.ToString() + ": " + errorMessage);
}
else
    StatusLabel.Text = user + @"'s Session terminated";

上面的代码在执行时返回错误“找不到指定的文件”消息。我已经尝试了路径组合到C:\windows\system32\logoff.exe但仍然得到相同的错误消息。

我还尝试使用以下参数调用 cmd.exe 进程:

@"/C logoff /SERVER:" + host + " " + sid

它返回“'logoff' is unrecognized as internal or external command, opreable program or batch file.” 仍然没有运气。

以前有人解决过这个问题吗?有关额外信息,我使用的是 windows 7,终端服务器是 windows server 2003 & 2008 r2(有多个服务器)。如果我直接从命令提示符运行“注销”命令,它可以很好地终止我的会话。

4

1 回答 1

-1

我通过将“logoff.exe”包含到项目中找到了解决方案,并将“logoff.exe”的“复制到输出目录”属性设置为“是”或者如果更新则复制,那么我不需要在我的Process.开始调用。

奇怪的是,当我尝试将“logoff.exe”包含到我的项目中时,VS 文件资源管理器没有列出“C:\windows\system32\”目录下的“logoff.exe”,但如果我执行文件就在那里通过 Windows 的常规文件资源管理器进入目录。

更新

正如评论中所指出的,当应用程序试图查看 system32 文件夹时,它似乎被 syswow64 层以某种方式中断。根据评论,我在项目设置中发现了一个将应用程序构建为 32 位的开关,我将其关闭,应用程序现在可以毫无问题地调用“logoff.exe”。但是当我尝试从 VS 文件资源管理器添加现有文件时,它仍然不会列出 system32 文件夹的完整内容(因为它正在查看 syswow64 文件夹)。

在此处输入图像描述

于 2013-12-27T04:33:28.237 回答