C# - Windows Feladatkezelőt letiltó komponens készítése

forráskód letöltése
Az NT alapokon nyugvó rendszerek felhasználói számára ismert és használt lehetőség a Windows Feladatkezelő szolgáltatás (Task Manager), melynek segítségével többek között nyomon követhetjük a számítógépen futó processzeket. Mint a Windows sok egyéb funkciója, ez a szolgáltatás is engedélyezhető, illetve letiltható a Rendszerleíró adatbázis megfelelő konfigurációjával. Cikkünkben elkészítünk egy komponenst, melynek logikai változójában engedélyezhetjük, vagy tilthatjuk a szolgáltatás elérését.
Komponens készítése
Ahogy a bevezetőben említettük, egyetlen bejegyzéssel elérhetjük, hogy Windows XP rendszerünkben a Feladatkezelő ne induljon el. A komponens DisableTaskManager nevű logikai property-jét igazra állítva elérhetjük, hogy a bejegyzés bekerüljön a Rendszerleíró adatbázis HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System kulcsába. A kulcsban el kell helyeznünk ekkor egy bejegyzést DisableTaskMgr néven, 1 értékkel.
A logikai property hamis értékével viszont megadhatjuk, hogy a bejegyzés törlődjön.
Ekkor a CTRL-ALT-DEL billentyűkombináció lenyomásával csak egy figyelmeztető üzenet jelenik meg, mely arról tájékoztat, hogy a rendszergazda letiltotta a funkciót.
A komponens kódját a DTMLibrary mappában találjuk. A kódban deklarálunk egy változót, mely a logikai értéket tartalmazza.

private bool disabletaskmanager = false;
Amikor a komponenst elhelyezzük egy alkalmazásban, akkor annak tulajdonságlapján szerkesztési időben is állítható a property értéke. A változó beállításakor egy esemény fut le, melyet magunk deklarálunk.
public delegate void ChangeDTMEventHandler(object sender,EventArgs e);
public event ChangeDTMEventHandler ChangeDTM;
Amikor a property SET művelete zajlik le, akkor az esemény delegáltját hozzárendeljük a kontrolhoz. A kezelőfüggvény paramétere EventArgs típusú, így nincs szükség külön osztály létrehozására.
public bool DisableTaskManager
{
  get{
    return disabletaskmanager;
  }
  set{
    disabletaskmanager = value;
    EventArgs e = new EventArgs();
    this.ChangeDTM += new ChangeDTMEventHandler(control_ChangeDTM); 
    ChangeDTM(this,e);
  }
}
A kezelőfüggvényben csak akkor végzünk műveletet, ha nem szerkesztési időben vagyunk. Amennyiben a property értéke TRUE, akkor a bejegyzést elhelyezzük a Rendszerleíró adatbázisban.
private void control_ChangeDTM(object sender,EventArgs e)
{
  if (!DesignMode)
  {
    if (disabletaskmanager)
    {
      RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, "");
      RegistryKey subkey = key.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
      subkey.SetValue("DisableTaskMgr", 1);
      subkey.Close();
    }
Amennyiben az érték FALSE, akkor töröljük a SYSTEM kulcsot, az alatta létrehozott bejegyzéssel együtt.
    else
    {
      RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, "");
      RegistryKey subkey = key.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies",true);
Itt megkeressük, hogy bejegyzés létezik-e, és csak akkor végezzük el a törlést.
      string[] keynames = subkey.GetSubKeyNames();
      bool exist = false;
      for(int i=0;i<keynames.Length;i++)
      {
        if (keynames[i] == "System")
        {
          exist = true;
        }
      }
      if (exist)
      {
        subkey.DeleteSubKey("System");
      }
    }
  }
}
A komponenst regisztrálnunk kell használat előtt a ToolBox palettán.
Felhasználás
A DTMClient alkalmazásban egyszerűen a Form-ra helyezzük a komponenst, mely nem rendelkezik grafikus felülettel. A Form listájában kiválasztjuk a kívánt műveletet, mely a gomb megnyomása után végrehajtódik.