我使用多用户Windows Server,而rdpclip错误每天都会让我们感到害怕。我们通常只是打开任务管理器并杀死然后重新启动rdpclip,但这是一个痛苦的屁股。我写了一个powershell脚本用于杀死然后重新启动rdpclip,但是没有人使用它,因为它是一个脚本(更不用说执行策略仅限于框)。我正在尝试编写一个快速而肮脏的Windows应用程序,您单击按钮以杀死rdpclip并重新启动它。但是我想将它限制为当前用户,并且找不到执行此操作的Process类的方法。到目前为止,这就是我所拥有的:
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist)
{
if (theprocess.ProcessName == "rdpclip")
{
theprocess.Kill();
Process.Start("rdpclip");
}
}
我不确定,但我认为这会杀死所有rdpclip进程。我想按用户选择,就像我的powershell脚本一样:
taskkill /fi "username eq $env:username" /im rdpclip.exe
& rdpclip.ex
我想我可以从我的可执行文件中调用powershell脚本,但这看起来相当糟糕。
提前为任何格式问题道歉,这是我第一次来这里。
更新:我还需要知道如何获取当前用户并仅选择那些进程。下面提出的WMI解决方案对我没有帮助。
UPDATE2:好的,我已经弄清楚如何获取当前用户,但它与远程桌面上的进程用户不匹配。任何人都知道如何获取用户名而不是SID?
干杯, fr0man
答案 0 :(得分:7)
好的,这就是我最终做的事情:
Process[] processlist = Process.GetProcesses();
bool rdpclipFound = false;
foreach (Process theprocess in processlist)
{
String ProcessUserSID = GetProcessInfoByPID(theprocess.Id);
String CurrentUser = WindowsIdentity.GetCurrent().Name.Replace("SERVERNAME\\","");
if (theprocess.ProcessName == "rdpclip" && ProcessUserSID == CurrentUser)
{
theprocess.Kill();
rdpclipFound = true;
}
}
Process.Start("rdpclip");
if (rdpclipFound)
{
MessageBox.Show("rdpclip.exe successfully restarted"); }
else
{
MessageBox.Show("rdpclip was not running under your username. It has been started, please try copying and pasting again.");
}
}
答案 1 :(得分:5)
我只是从StartInfo.EnvironmentVariables中获取数据,而不是使用GetProcessInfoByPID。
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Security.Principal;
using System.Runtime.InteropServices;
namespace KillRDPClip
{
class Program
{
static void Main(string[] args)
{
Process[] processlist = Process.GetProcesses();
foreach (Process theprocess in processlist)
{
String ProcessUserSID = theprocess.StartInfo.EnvironmentVariables["USERNAME"];
String CurrentUser = Environment.UserName;
if (theprocess.ProcessName.ToLower().ToString() == "rdpclip" && ProcessUserSID == CurrentUser)
{
theprocess.Kill();
}
}
}
}
}
答案 2 :(得分:1)
阅读以下CodeProject文章,它包含您需要的所有信息:
答案 3 :(得分:0)
您可以在隐藏模式下打开cmd并终止特定于用户的进程。在这里,我正在尝试终止特定于当前用户的Excel进程:
String CurrentUser = Environment.UserName;
Process[] allExcelProcesses = Process.GetProcessesByName("excel");
if (null != allExcelProcesses)
{
Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C TASKKILL /F /FI \"USERNAME eq " + CurrentUser + "\" /IM EXCEL.EXE";
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
}