Rendszermódosító parancsmag létrehozása

Előfordulhat, hogy egy parancsmagnak módosítania kell a rendszer futási állapotát, nem csak a futtatókörnyezet Windows PowerShell állapotát. Ezekben az esetekben a parancsmagnak lehetővé kell tennie a felhasználó számára annak megerősítését, hogy a módosításra szükség van-e.

A megerősítés támogatásához a parancsmagnak két dolgot kell megtennie.

A megerősítés támogatásával a parancsmag elérhetővé teszi az Windows PowerShell által biztosított és paramétereket, és megfelel a parancsmagok fejlesztési irányelveinek (További információ a parancsmagok fejlesztésével kapcsolatos irányelvekről: Confirm WhatIf Cmdlet Development Guidelines.).

A rendszer módosítása

A "rendszer módosítása" minden olyan parancsmagra vonatkozik, amely esetleg megváltoztatja a rendszer állapotát a Windows PowerShell. Például egy folyamat leállítása, egy felhasználói fiók engedélyezése vagy letiltása, vagy egy sor adatbázistáblához való hozzáadása a rendszer minden meg kell erősítenie. Ezzel szemben az adatokat beolvasó vagy átmeneti kapcsolatokat létesítő műveletek nem módosítják a rendszert, és általában nem igényelnek megerősítést. Megerősítésre nincs szükség az olyan műveleteknél sem, amelyeknek a hatása a Windows PowerShell belülre van korlátozva, például a következő esetében: set-variable . Azok a parancsmagok, amelyek perzisztens változást eszköznek vagy nem, deklarálják és meg kell hívniuk SupportsShouldProcess a System.Management.Automation.Cmdlet.ShouldProcess parancsmagot, csak akkor, ha állandó változást fognak tenni.

Megjegyzés

A ShouldProcess megerősítése csak a parancsmagok esetén érvényes. Ha egy parancs vagy szkript a .NET-metódusok vagy -tulajdonságok közvetlen hívásával vagy a Windows PowerShell-n kívüli alkalmazások hívásával módosítja a rendszer futási állapotát, ez a megerősítési mód nem lesz elérhető.

A StopProc parancsmag

Ez a témakör egy Stop-Proc parancsmagot ismertet, amely megkísérli leállítani a Get-Proc-parancsmag használatával lekért folyamatokat (lásd: Creating Your First Cmdlet).

A parancsmag meghatározása

A parancsmagok létrehozásának első lépése mindig a parancsmag elnevezése és a parancsmagot megvalósító .NET-osztály deklarációja. Mivel olyan parancsmagot ír, amely módosítja a rendszert, ennek megfelelően kell elnevezni. Ez a parancsmag leállítja a rendszerfolyamatokat, így az itt kiválasztott parancsnév a "Stop", amelyet a System.Management.Automation.Verbslifecycle osztály határoz meg, és a "Proc" főnév jelzi, hogy a parancsmag leállítja a folyamatokat. A jóváhagyott parancsmag-parancsmagokkal kapcsolatos további információkért lásd: Parancsmag-parancsmagok nevei.

A következő a parancsmag osztálydefiníciójaStop-Proc parancsmaghoz.

[Cmdlet(VerbsLifecycle.Stop, "Proc",
        SupportsShouldProcess = true)]
public class StopProcCommand : Cmdlet

Vegye figyelembe, hogy a System.Management.Automation.CmdletAttribute deklarációban az attribútum kulcsszó úgy van beállítva, hogy lehetővé tegye a parancsmag számára a következő hívásokat: SupportsShouldProcess true System.Management.Automation.Cmdlet.ShouldProcess és System.Management.Automation.Cmdlet.ShouldContinue. A kulcsszó beállítása nélkül a és a Confirm paraméter nem lesz elérhető a felhasználó WhatIf számára.

Rendkívül kipusztító műveletek

Egyes műveletek rendkívül károsak, például újraformálnak egy aktív merevlemez-partíciót. Ezekben az esetekben a parancsmagot a ConfirmImpact = ConfirmImpact.High System.Management.Automation.CmdletAttribute attribútum deklarálásakor kell beállítani. Ez a beállítás arra kényszeríti a parancsmagot, hogy akkor is felhasználói megerősítést kérjen, ha a felhasználó nem adott meg Confirm paramétert. A parancsmag-fejlesztőknek azonban el kell kerülniük a csak potenciálisan kioltó műveletek túlhasználódását, például egy felhasználói fiók ConfirmImpact törlését. Ne feledje, hogy ha ConfirmImpact a System.Management.Automation.ConfirmImpactHigh van beállítva.

Hasonlóképpen, egyes műveletek valószínűleg nem lesznek károsak, bár elméletben módosítják egy rendszer futási állapotát a Windows PowerShell. Az ilyen parancsmagok a ConfirmImpact System.Management.Automation.Confirmimpact.Low beállításra is beállíthatók. Ez megkerüli a megerősítési kéréseket, ha a felhasználó csak a közepes és a nagy hatással járó műveletek megerősítését kérte.

Rendszermódosítás paramétereinek definiálása

Ez a szakasz a parancsmag paramétereinek definiálását ismerteti, beleértve azokat is, amelyek a rendszer módosításának támogatásához szükségesek. Ha általános információkra van szüksége a paraméterek meghatározásával kapcsolatban, tekintse meg a Parancssori bemenetet feldolgozására vonatkozó paraméterek hozzáadása.

A Stop-Proc parancsmag három paramétert határoz meg: Name , Force és PassThru .

A Name paraméter a folyamat bemeneti Name objektumának tulajdonságának felel meg. Vegye figyelembe, hogy a mintában található paraméter kötelező, mivel a parancsmag sikertelen lesz, ha nem rendelkezik leállítható megnevezett Name folyamattal.

A Force paraméter lehetővé teszi, hogy a felhasználó felülbírálja a System.Management.Automation.Cmdlet.ShouldContinue hívásait. Valójában minden, a System.Management.Automation.Cmdlet.ShouldContinue függvényt hívó parancsmagnak egy paraméterrel kell lennie, hogy ha meg van adva, a parancsmag kihagyja a Force Force System.Management.Automation.Cmdlet.ShouldContinue hívását, és folytatja a műveletet. Vegye figyelembe, hogy ez nincs hatással a System.Management.Automation.Cmdlet.ShouldProcess hívásaira.

A paraméter lehetővé teszi a felhasználó számára annak jelzését, hogy a parancsmag átadja-e a kimeneti objektumot a folyamaton keresztül, ebben az esetben PassThru a folyamat leállása után. Vegye figyelembe, hogy ez a paraméter a parancsmaghoz van kötve a bemeneti objektum tulajdonsága helyett.

Lássunk egy paraméterdeklarációt a Stop-Proc parancsmaghoz.

[Parameter(
           Position = 0,
           Mandatory = true,
           ValueFromPipeline = true,
           ValueFromPipelineByPropertyName = true
)]
public string[] Name
{
  get { return processNames; }
  set { processNames = value; }
}
private string[] processNames;

/// <summary>
/// Specify the Force parameter that allows the user to override
/// the ShouldContinue call to force the stop operation. This
/// parameter should always be used with caution.
/// </summary>
[Parameter]
public SwitchParameter Force
{
  get { return force; }
  set { force = value; }
}
private bool force;

/// <summary>
/// Specify the PassThru parameter that allows the user to specify
/// that the cmdlet should pass the process object down the pipeline
/// after the process has been stopped.
/// </summary>
[Parameter]
public SwitchParameter PassThru
{
  get { return passThru; }
  set { passThru = value; }
}
private bool passThru;

Bemeneti feldolgozási metódus felülbírálása

A parancsmagnak felül kell bírálni egy bemeneti feldolgozási metódust. Az alábbi kód bemutatja a minta-parancsmagban használt System.Management.Automation.Cmdlet.ProcessRecord felülbírálást Stop-Proc parancsmagban. Ez a metódus minden kért folyamatnévhez biztosítja, hogy a folyamat ne speciális folyamat legyen, megpróbálja leállítani a folyamatot, majd kimeneti objektumot küld, ha a paraméter PassThru meg van adva.

protected override void ProcessRecord()
{
  foreach (string name in processNames)
  {
    // For every process name passed to the cmdlet, get the associated
    // process(es). For failures, write a non-terminating error
    Process[] processes;

    try
    {
      processes = Process.GetProcessesByName(name);
    }
    catch (InvalidOperationException ioe)
    {
      WriteError(new ErrorRecord(ioe,"Unable to access the target process by name",
                 ErrorCategory.InvalidOperation, name));
      continue;
    }

    // Try to stop the process(es) that have been retrieved for a name
    foreach (Process process in processes)
    {
      string processName;

      try
      {
        processName = process.ProcessName;
      }

      catch (Win32Exception e)
        {
          WriteError(new ErrorRecord(e, "ProcessNameNotFound",
                     ErrorCategory.ReadError, process));
          continue;
        }

        // Call Should Process to confirm the operation first.
        // This is always false if WhatIf is set.
        if (!ShouldProcess(string.Format("{0} ({1})", processName,
                           process.Id)))
        {
          continue;
        }
        // Call ShouldContinue to make sure the user really does want
        // to stop a critical process that could possibly stop the computer.
        bool criticalProcess =
             criticalProcessNames.Contains(processName.ToLower());

        if (criticalProcess &&!force)
        {
          string message = String.Format
                ("The process \"{0}\" is a critical process and should not be stopped. Are you sure you wish to stop the process?",
                processName);

          // It is possible that ProcessRecord is called multiple times
          // when the Name parameter receives objects as input from the
          // pipeline. So to retain YesToAll and NoToAll input that the
          // user may enter across multiple calls to ProcessRecord, this
          // information is stored as private members of the cmdlet.
          if (!ShouldContinue(message, "Warning!",
                              ref yesToAll,
                              ref noToAll))
          {
            continue;
          }
        } // if (criticalProcess...
        // Stop the named process.
        try
        {
          process.Kill();
        }
        catch (Exception e)
        {
          if ((e is Win32Exception) || (e is SystemException) ||
              (e is InvalidOperationException))
          {
            // This process could not be stopped so write
            // a non-terminating error.
            string message = String.Format("{0} {1} {2}",
                             "Could not stop process \"", processName,
                             "\".");
            WriteError(new ErrorRecord(e, message,
                       ErrorCategory.CloseError, process));
                       continue;
          } // if ((e is...
          else throw;
        } // catch

        // If the PassThru parameter argument is
        // True, pass the terminated process on.
        if (passThru)
        {
          WriteObject(process);
        }
    } // foreach (Process...
  } // foreach (string...
} // ProcessRecord

A ShouldProcess metódus hívása

A parancsmag bemeneti feldolgozási metódusának meg kell hívnia a System.Management.Automation.Cmdlet.ShouldProcess metódust a művelet végrehajtásának megerősítéséhez, mielőtt a rendszer futási állapotába módosítás (például fájlok törlése) készül. Ez lehetővé teszi a Windows PowerShell, hogy a rendszerhéjban a megfelelő "WhatIf" és "Confirm" viselkedést biztosítsa.

Megjegyzés

Ha egy támogatott parancsmagnak fel kell tudnia feldolgoznia a System.Management.Automation.Cmdlet.ShouldProcess hívást, a felhasználó váratlanul módosíthatja a rendszert.

A System.Management.Automation.Cmdlet.ShouldProcess hívása elküldi a módosítani szükséges erőforrás nevét a felhasználónak úgy, hogy a Windows PowerShell-runtime figyelembe veszi a parancssori beállításokat vagy preferenciaváltozókat annak meghatározásához, hogy mit kell megjeleníteni a felhasználó számára.

Az alábbi példa a System.Management.Automation.Cmdlet.ShouldProcess hívását mutatja be a minta parancsmag System.Management.Automation.Cmdlet.ProcessRecor Stop-Proc d metódusának felülbírálásából.

if (!ShouldProcess(string.Format("{0} ({1})", processName,
                   process.Id)))
{
  continue;
}

A ShouldContinue metódus hívása

A System.Management.Automation.Cmdlet.ShouldContinue metódus hívása egy másodlagos üzenetet küld a felhasználónak. Ez a hívás azután történik, hogy a System.Management.Automation.Cmdlet.ShouldProcess visszaadott hívása, és ha a paraméter nem a következőre lett true Force beállítva: true . A felhasználó ezután visszajelzést küldhet arról, hogy folytatni kell-e a műveletet. A parancsmag a System.Management.Automation.Cmdlet.ShouldContinue függvényt hívja meg további ellenőrzésként a potenciálisan veszélyes rendszermódosítások ellenőrzéséhez, vagy ha igen-az-összesre és "mindenhez" lehetőséget szeretne biztosítani a felhasználónak.

Az alábbi példa a System.Management.Automation.Cmdlet.ShouldContinue hívását mutatja be a minta parancsmag System.Management.Automation.Cmdlet.ProcessRecor Stop-Proc d metódusának felülbírálásából.

if (criticalProcess &&!force)
{
  string message = String.Format
        ("The process \"{0}\" is a critical process and should not be stopped. Are you sure you wish to stop the process?",
        processName);

  // It is possible that ProcessRecord is called multiple times
  // when the Name parameter receives objects as input from the
  // pipeline. So to retain YesToAll and NoToAll input that the
  // user may enter across multiple calls to ProcessRecord, this
  // information is stored as private members of the cmdlet.
  if (!ShouldContinue(message, "Warning!",
                      ref yesToAll,
                      ref noToAll))
  {
    continue;
  }
} // if (criticalProcess...

Bemenet feldolgozásának leállítása

A rendszermódosításokat elkenő parancsmag bemeneti feldolgozási metódusának módot kell adnia a bemenet feldolgozásának leállítására. Ebben az Stop-Proc parancsmagban a System.Management.Automation.Cmdlet.ProcessRecord metódusról a System.Diagnostics.Process.Kill* metódusra történt hívás. Mivel a paraméter értéke PassThru true , a System.Management.Automation.Cmdlet.ProcessRecord a System.Management.Automation.Cmdlet.WriteObject hívásával is elküldi a folyamatobjektumot a folyamatnak.

Kódminta

A teljes C#-mintakódért tekintse meg a StopProcessSample01 mintát.

Objektumtípusok definiálása és formázása

Windows PowerShell .NET-objektumokat használó parancsmagok között továbbítja az információkat. Emiatt előfordulhat, hogy egy parancsmagnak meg kell határoznia a saját típusát, vagy a parancsmagnak ki kell terjesztenie egy másik parancsmag által biztosított meglévő típust. További információ az új típusok meghatározásáról vagy a meglévő típusok kiterjesztéséről: Extending Object Types and Formatting (Az objektumtípusok kiterjesztése és formázása).

A parancsmag kiépítése

A parancsmagot a megvalósítása után regisztrálni kell a Windows PowerShell egy Windows PowerShell beépülő modulon keresztül. További információ a parancsmagok regisztrálásról: Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása.

A parancsmag tesztelése

Miután regisztrálta a parancsmagot a Windows PowerShell, a parancssorban futtatva tesztelheti. Íme néhány teszt, amelyek tesztelik Stop-Proc parancsmagot. A parancsmagok parancssorból való használatával kapcsolatos további információkért lásd: Getting Started with Windows PowerShell.

  • Indítsa Windows PowerShell, és a Stop-Proc parancsmag használatával állítsa le a feldolgozást az alább látható módon. Mivel a parancsmag kötelezőként határozza meg a Name paramétert, a parancsmag lekérdezi a paramétert.

    PS> stop-proc
    

    Az alábbi kimenet jelenik meg.

    Cmdlet stop-proc at command pipeline position 1
    Supply values for the following parameters:
    Name[0]:
    
  • Most a parancsmag használatával állítsa le a "NOTEPAD" nevű folyamatot. A parancsmag a művelet megerősítését kéri.

    PS> stop-proc -Name notepad
    

    Az alábbi kimenet jelenik meg.

    Confirm
    Are you sure you want to perform this action?
    Performing operation "stop-proc" on Target "notepad (4996)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
    
  • A Stop-Proc a "WINLOGON" nevű kritikus folyamat leállításához használja a következőt: . A rendszer figyelmezteti a művelet végrehajtásához, mivel ez az operációs rendszer újraindítását fogja okozhatni.

    PS> stop-proc -Name Winlogon
    

    Az alábbi kimenet jelenik meg.

    Confirm
    Are you sure you want to perform this action?
    Performing operation "stop-proc" on Target "winlogon (656)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
    Warning!
    The process " winlogon " is a critical process and should not be stopped. Are you sure you wish to stop the process?
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): N
    
  • Most próbáljuk meg leállítani a WINLOGON folyamatot figyelmeztetés nélkül. Vegye figyelembe, hogy ez a parancsbejegyzés a Force paraméter használatával bírálja felül a figyelmeztetést.

    PS> stop-proc -Name winlogon -Force
    

    Az alábbi kimenet jelenik meg.

    Confirm
    Are you sure you want to perform this action?
    Performing operation "stop-proc" on Target "winlogon (656)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): N
    

Lásd még:

Bemeneti adatokat Command-Line paraméterek hozzáadása

Objektumtípusok kiterjesztése és formázása

Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása

Windows PowerShell SDK

Parancsmagminták