我正在尝试创建一个应用程序,它可以在终端服务器上杀死用户的会话。我编写了以下代码:
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‘命令,它可以很好地杀死我的会话。
发布于 2013-12-27 04:33:28
我找到了解决方案,将'logoff.exe‘包含在项目中,并将'Copy to output目录’属性'logoff.exe‘设置为’yes‘,或者复制(如果更新),这样就不需要在logoff.exe调用时指定完整的路径。
奇怪的是,当我试图将'logoff.exe‘包含到我的项目中时,VS文件资源管理器没有列出’C:\windows\system32 32‘目录下的'logoff.exe’,但是如果我通过windows的常规文件资源管理器进入目录,可执行文件就在那里。
更新
正如评论中指出的那样,当应用程序试图查看system32文件夹时,它会被syswow64层所打断。基于这段评论,我发现项目设置中有一个开关,可以将应用程序构建为32位,我关闭了它,该应用程序现在可以调用“logoff.exe”,没有任何问题。但是,当我尝试从VS文件资源管理器添加现有文件时,它仍然不会列出system32文件夹的完整内容(因为它正在查看syswow64文件夹)。
https://stackoverflow.com/questions/20794250
复制相似问题