2009-01-09 16 views
5

Trabajo fuera de un servidor Windows multiusuario, y el error rdpclip nos muerde todos los días. Usualmente solo abrimos el administrador de tareas y lo matamos, luego reiniciamos rdpclip, pero eso es un problema en el trasero. Escribí un script de powershell para matar y luego reiniciar rdpclip, pero nadie lo usa porque es un script (sin mencionar que la política de ejecución está restringida para el cuadro). Intento escribir una aplicación de Windows rápida y sucia donde haga clic en un botón para matar rdpclip y reiniciarlo. Pero quiero restringirlo al usuario actual y no puedo encontrar un método para la clase Process que hace esto. Hasta el momento, esto es lo que tengo:¿Cómo se mata un proceso para un usuario particular en .NET (C#)?

Process[] processlist = Process.GetProcesses(); 
foreach(Process theprocess in processlist) 
{ 
    if (theprocess.ProcessName == "rdpclip") 
    { 
     theprocess.Kill(); 
     Process.Start("rdpclip"); 
    } 
} 

No estoy seguro, pero creo que va a matar a todos los procesos Rdpclip. Me gustaría seleccionar por el usuario, al igual que mi script PowerShell:

taskkill /fi "username eq $env:username" /im rdpclip.exe 
& rdpclip.ex 

supongo que sólo podía invocar el script de PowerShell de mi ejecutable, pero que parece bastante kludgy.

Disculpas de antemano por cualquier problema de formato, esta es mi primera vez aquí.

ACTUALIZACIÓN: También necesito saber cómo obtener el usuario actual y seleccionar solo esos procesos. La solución de WMI que se propone a continuación no me ayuda a obtener eso.

ACTUALIZACIÓN2: Bien, he descubierto cómo obtener el usuario actual, pero no coincide con el usuario del proceso a través de Escritorio remoto. ¿Alguien sabe cómo obtener un nombre de usuario en lugar del SID?

Saludos, fr0man

Respuesta

6

Ok, esto es lo que terminé haciendo:

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

      } 
+0

Tuve que reemplazar WindowsIdentity.GetCurrent(). Nombre con WindowsIdentity.GetCurrent(). User.Value para que esto funcione. –

+0

+1 gracias ... eso era lo que estaba buscando –

1

Lea el siguiente artículo CodeProject, tiene toda la información que necesita:

How To Get Process Owner ID and Current User SID

+0

Se ve bien, excepto que no puedo obtener VS para ObjectQuery reconocido, incluso con un uso de System.Management. Esta es un área con la que no estoy familiarizado. – fr0man

+0

Ah, no importa. Eso solo es compatible con .NET 2.0 y versiones posteriores. Corregido ahora. – fr0man

+0

Personalmente, iría por la ruta Win32/PInvoke en lugar de WMI en este caso. Sin embargo, eso es solo preferencia, creo que el método WMI funcionaría igual de bien. – BobbyShaftoe

3

In lugar de usar GetProcessInfoByPID, simplemente tomo los datos de 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(); 
       } 
      } 
     } 
    } 
} 
Cuestiones relacionadas