调用logoff.exe时出错

时间:2013-12-27 03:18:33

标签: c# command-line command-prompt system-administration logoff

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

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'命令,它可以正常杀死我的会话。

1 个答案:

答案 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文件夹)。

enter image description here