Как убить процесс для конкретного пользователя в .NET (C #)? - PullRequest
6 голосов
/ 09 января 2009

Я работаю на многопользовательском 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, предложенное ниже, не помогает мне получить это.

ОБНОВЛЕНИЕ2: Хорошо, я выяснил, как получить текущего пользователя, но он не соответствует пользователю процесса через удаленный рабочий стол. Кто-нибудь знает, как получить имя пользователя вместо SID?

Ура, fr0man

Ответы [ 3 ]

7 голосов
/ 09 января 2009

Хорошо, вот что я в итоге сделал:

           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.");
            }

            }
5 голосов
/ 08 октября 2013

Вместо использования GetProcessInfoByPID я просто извлекаю данные из StartInfo.EnvironmentVariables.

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();
                }
            }
        }
    }
}
1 голос
/ 09 января 2009

Прочитайте следующую статью CodeProject, она содержит всю необходимую информацию:

Как получить идентификатор владельца процесса и SID текущего пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...