我正在尝试创建一个可以终止用户在终端服务器上的会话的应用。 我写了以下代码:
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'无法识别为内部或外部命令,可选程序或批处理文件。”但仍然没有运气。
以前有人曾经解决过这个问题吗? 有关额外信息,我使用的是Windows 7,终端服务器是Windows Server 2003& 2008 r2(有多台服务器)。 如果我直接从命令提示符运行'logoff'命令,它可以正常杀死我的会话。
答案 0 :(得分:-1)
通过将'logoff.exe'包含到项目中并将'logoff.exe'的'复制到输出目录'属性设置为yes或者如果更新则复制,我找到了解决方案,然后我不需要指定完整我的Process.Start调用路径。
奇怪的是,当我尝试将'logoff.exe'包含到我的项目中时,VS文件资源管理器没有在'C:\ windows \ system32 \'目录下列出'logoff.exe',但可执行文件是如果我通过Windows的常规文件浏览器进入目录。
<强>更新强>
正如评论中所指出的那样,当应用程序试图查看system32文件夹时,它会以某种方式被syswow64层中断。根据评论我发现在项目设置中切换为32位构建应用程序,我关闭它,应用程序现在可以毫无问题地调用'logoff.exe'。但是当我尝试从VS文件浏览器添加现有文件时,它仍然不会列出system32文件夹的完整内容(因为它正在查看syswow64文件夹)。