Windows PowerShelles tárolószolgáltató létrehozása

Ez a témakör azt ismerteti, hogyan hozhat létre Windows PowerShell többrétegű adattárakat is képes szolgáltatót. Az ilyen típusú adattárak esetén az adattár legfelső szintje tartalmazza a gyökérelemeket, az ezt követő szinteket pedig gyermekelemek csomópontjának nevezzük. Azáltal, hogy lehetővé teszi, hogy a felhasználó ezeken a gyermekcsomópontokon dolgozzon, hierarchikusan kommunikálhat az adattáron keresztül.

A többszintű adattárakon is képes szolgáltatókat tárolószolgáltatóknak Windows PowerShell nevezzük. Vegye figyelembe azonban, hogy Windows PowerShell tárolószolgáltató csak akkor használható, ha egy tároló (beágyazott tárolók nélkül) tartalmaz elemeket. Ha vannak beágyazott tárolók, akkor létre kell Windows PowerShell navigációszolgáltatót. További információ a navigációs szolgáltató Windows PowerShell létrehozásáról: Creating a Windows PowerShell Navigation Provider (Új navigációszolgáltató létrehozása).

Megjegyzés

Ehhez a szolgáltatóhoz letöltheti a C#-forrásfájlt (AccessDBSampleProvider04.cs) a Microsoft Windows Vista és a .NET-keretrendszer 3.0 Runtime Components microsoftos Windows Windows Szoftverfejlesztői készletével. A letöltési utasításokért lásd: How to Install Windows PowerShell and Download the Windows PowerShell SDK. A letöltött forrásfájlok a könyvtárban <PowerShell Samples> érhetők el. További információ a Windows PowerShell implementációiról: Designing Your Windows PowerShell Provider(Saját Windows PowerShell tervezése).

Az Windows PowerShell ismertetett tárolószolgáltató egyetlen tárolóként definiálja az adatbázist, az adatbázis tábláit és sorait pedig a tároló elemeiként definiálja.

Figyelemfelhívás

Vegye figyelembe, hogy ez a kialakítás olyan adatbázist feltételez, amely névazonosítóval rendelkezik egy mezővel, és hogy a mező típusa LongInteger.

Tárolószolgáltatói Windows PowerShell definiálása

A Windows PowerShell tárolószolgáltatónak meg kell határoznia egy .NET-osztályt, amely a System.Management.Automation.Provider.Containercmdletprovider alaposztályból származik. Itt található az ebben a szakaszban Windows PowerShell tárolószolgáltató osztálydefiníciója.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider

Figyelje meg, hogy ebben az osztálydefinícióban a System.Management.Automation.Provider.Cmdletproviderattribute attribútum két paramétert tartalmaz. Az első paraméter egy felhasználóbarát nevet ad meg a szolgáltatónak, amelyet a Windows PowerShell. A második paraméter határozza meg Windows PowerShell szolgáltató által a Windows PowerShell futtatás során elérhetővé Windows PowerShell adott képességeket. Ehhez a szolgáltatóhoz nincsenek Windows PowerShell hozzáadott funkciók.

Alapfunkciók meghatározása

A Designing Your Windows PowerShell Provider (Saját Windows PowerShell-szolgáltatótervezése) oldalon leírtak szerint a System.Management.Automation.Provider.Containercmdletprovider osztály számos más osztályból származik, amelyek különböző szolgáltatói funkciókat biztosítottak. A Windows PowerShell tárolószolgáltatónak ezért meg kell határoznia az osztályok által biztosított összes funkciót.

A munkamenet-specifikus inicializálási információk hozzáadását és a szolgáltató által használt erőforrások felszabadítását biztosító funkciók megvalósításához lásd: Alapszintű Windows PowerShell Provider létrehozása. A legtöbb szolgáltató (beleértve az itt leírt szolgáltatót is) használhatja a jelen funkció alapértelmezett implementációját, amelyet a Windows PowerShell.

Az adattárhoz való hozzáféréshez a szolgáltatónak implementálnunk kell a System.Management.Automation.Provider.Drivecmdletprovider alaposztály metódusát. További információ a metódusok megvalósításáról: Új meghajtószolgáltató Windows PowerShell létrehozása.

Egy adattár elemeinek (például lekért, be- és törlés) kezeléséhez a szolgáltatónak implementálnunk kell a System.Management.Automation.Provider.Itemcmdletprovider alaposztály által biztosított metódusokat. A metódusok megvalósításával kapcsolatos további információkért lásd: Creating an Windows PowerShell Item Provider (Adatelem-szolgáltató létrehozása).

Gyermekelemek leolvasása

Gyermekelem lekéréséhez a Windows PowerShell-tárolószolgáltatónak felül kell bírálni a System.Management.Automation.Provider.Containercmdletprovider.Get childitems* metódust a parancsmag hívásának Get-ChildItem támogatásához. Ez a metódus lekéri a gyermekelemeket az adattárból, és objektumként írja őket a folyamatba. Ha a parancsmag paramétere meg van adva, a metódus lekéri az összes gyermekét, függetlenül attól, hogy recurse milyen szinten vannak. Ha a recurse paraméter nincs megadva, a metódus csak egyetlen gyermekszintet ad vissza.

Itt található a System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* metódus implementációja ehhez a szolgáltatóhoz. Figyelje meg, hogy ez a metódus lekéri az összes adatbázistáblában lévő gyermekelemeket, ha az elérési út az Access adatbázist jelzi, és a gyermekelemeket a tábla soraiból olvassa be, ha az elérési út adattáblát jelez.

protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are 
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then 
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems

A GetChildItems megvalósításával kapcsolatos dolgok

Az alábbi feltételek vonatkozhatnak a System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* implementációra:

Dinamikus paraméterek csatolása a Get-ChildItem parancsmaghoz

Néha a Get-ChildItem System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* hívására szolgáló parancsmaghoz további paraméterekre van szükség, amelyek dinamikusan vannak megadva futásidőben. A dinamikus paraméterek megvalósításához a Windows PowerShell tárolószolgáltatónak implementálja a System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters* metódust. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett elérési úton, és egy olyan objektumot ad vissza, amely a parancsmagosztályhoz vagy a System.Management.Automation.Runtimedefinedparameterdictionary objektumhoz hasonló elemzési attribútumokkal és tulajdonságokkal rendelkezik. A Windows PowerShell a visszaadott objektummal adja hozzá a paramétereket a Get-ChildItem parancsmaghoz.

Ez Windows PowerShell tárolószolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Gyermekelemnevek leolvasása

A gyermekelemek nevének lekéréséhez az Windows PowerShell-tárolószolgáltatónak felül kell bírálni a System.Management.Automation.Provider.Containercmdletprovider.Get childnames* metódust, hogy támogassa a parancsmag hívásait, ha meg van adva a Get-ChildItem Name paramétere. Ez a metódus lekéri az összes tároló megadott elérési útjának vagy gyermekelem-nevének gyermekelemnevét, ha a returnAllContainers parancsmag paramétere meg van adva. A gyermeknév az elérési út levélrésze. Az elérési út gyermekneve például "c:\windows\system32\abc.dll" abc.dll. A c:\windows\system32 könyvtár gyermekneve "system32".

Itt található a System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* metódus implementációja ehhez a szolgáltatóhoz. Figyelje meg, hogy a metódus lekéri a táblaneveket, ha a megadott elérési út az Access-adatbázist (meghajtó) és a sorszámokat jelzi, ha az elérési út egy táblát jelez.

protected override void GetChildNames(string path,
                              ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the 
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames

A GetChildNames megvalósításával kapcsolatos dolgok

Az alábbi feltételek vonatkozhatnak a System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* implementációra:

Dinamikus paraméterek csatolása a Get-ChildItem parancsmaghoz (Név)

Néha a parancsmaghoz (a paraméterrel) további paraméterekre van szükség, amelyek dinamikusan vannak megadva Get-ChildItem Name futásidőben. A dinamikus paraméterek megvalósításához a Windows PowerShell tárolószolgáltatónak implementálja a System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters* metódust. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett elérési úton, és visszaad egy objektumot, amely a parancsmagosztályhoz vagy a System.Management.Automation.Runtimedefinedparameterdictionary objektumhoz hasonló elemzési attribútumokkal és mezőkkel rendelkezik. A Windows PowerShell a visszaadott objektummal adja hozzá a paramétereket a Get-ChildItem parancsmaghoz.

Ez a szolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Elemek átnamozása

Egy elem átnevezéséhez egy Windows PowerShell-tárolószolgáltatónak felül kell bírálni a System.Management.Automation.Provider.Containercmdletprovider.Renameitem* metódust a parancsmag hívásának Rename-Item támogatásához. Ez a metódus módosítja a megadott elérési úton található elem nevét a megadott új névre. Az új névnek mindig a szülőelemhez (tárolóhoz) viszonyítottnak kell lennie.

Ez a szolgáltató nem bírálja felül a System.Management.Automation.Provider.Containercmdletprovider.Renameitem* metódust. Az alapértelmezett megvalósítás azonban a következő.

A RenameItem megvalósításával kapcsolatos dolgok

Az alábbi feltételek vonatkozhatnak a System.Management.Automation.Provider.Containercmdletprovider.Renameitem* implementációra:

Dinamikus paraméterek csatolása a Rename-Item parancsmaghoz

Előfordulhat, hogy a parancsmaghoz további paraméterekre van Rename-Item szükség, amelyek dinamikusan vannak megadva futásidőben. A dinamikus paraméterek megvalósításához Windows PowerShell tárolószolgáltatónak implementálja a System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters* metódust. Ez a metódus lekéri az elem paramétereit a jelzett elérési úton, és egy olyan objektumot ad vissza, amely a parancsmagosztályhoz vagy a System.Management.Automation.Runtimedefinedparameterdictionary objektumhoz hasonló elemzési attribútumokkal rendelkezik. A Windows PowerShell futtatás a visszaadott objektummal adja hozzá a paramétereket a Rename-Item parancsmaghoz.

Ez a tárolószolgáltató nem implementálja ezt a metódust. A metódus alapértelmezett implementációja azonban a következő kód.

Új elemek létrehozása

Új elemek létrehozásához a tárolószolgáltatónak implementálja a System.Management.Automation.Provider.Containercmdletprovider.Newitem* metódust a parancsmag hívásának New-Item támogatásához. Ez a metódus létrehoz egy adatelemet a megadott elérési úton. A parancsmag paramétere tartalmazza az új elem szolgáltató type által definiált típusát. A Fájlrendszer szolgáltató például egy type "file" vagy "directory" értékű paramétert használ. A newItemValue parancsmag paramétere szolgáltatóspecifikus értéket ad meg az új elemhez.

Itt található a System.Management.Automation.Provider.Containercmdletprovider.Newitem* metódus implementációja ehhez a szolgáltatóhoz.

protected override void NewItem( string path, string type, object newItemValue )
{
    // Create the new item here after
    // performing necessary validations
    //
    // WriteItemObject(newItemValue, path, false);

    // Example
    //
    // if (ShouldProcess(path, "new item"))
    // {
    //      // Create a new item and then call WriteObject
    //      WriteObject(newItemValue, path, false);
    // }

} // NewItem
{
    case 1:
        {
            string name = pathChunks[0];

            if (TableNameIsValid(name))
            {
                tableName = name;
                retVal = PathType.Table;
            }
        }
        break;

    case 2:
        {
            string name = pathChunks[0];

A NewItem megvalósításával kapcsolatos dolgok

Az alábbi feltételek vonatkozhatnak a System.Management.Automation.Provider.Containercmdletprovider.Newitem* implementációra:

Dinamikus paraméterek csatolása a New-Item parancsmaghoz

Előfordulhat, hogy a parancsmaghoz további paraméterekre van New-Item szükség, amelyek dinamikusan vannak megadva futásidőben. A dinamikus paraméterek megvalósításához a tárolószolgáltatónak implementálja a System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* metódust. Ez a metódus lekéri az elem paramétereit a jelzett elérési úton, és egy olyan objektumot ad vissza, amely a parancsmagosztályhoz vagy a System.Management.Automation.Runtimedefinedparameterdictionary objektumhoz hasonló elemzési attribútumokkal rendelkezik. A Windows PowerShell futtatás a visszaadott objektummal adja hozzá a paramétereket a New-Item parancsmaghoz.

Ez a szolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Elemek eltávolítása

Elemek eltávolításához a Windows PowerShell-szolgáltatónak felül kell bírálni a System.Management.Automation.Provider.Containercmdletprovider.Removeitem* metódust a parancsmag hívásának Remove-Item támogatásához. Ez a metódus töröl egy elemet az adattárból a megadott elérési úton. Ha a parancsmag paramétere , a metódus a szintjüktől függetlenül eltávolítja az összes recurse Remove-Item true gyermekelemet. Ha a paraméter értéke , a metódus csak egyetlen elemet távolít el false a megadott elérési úton.

Ez a szolgáltató nem támogatja az elemek eltávolítását. A következő kód azonban a System.Management.Automation.Provider.Containercmdletprovider.Removeitem* alapértelmezett implementációja.

A RemoveItem megvalósításával kapcsolatos dolog, amit meg kell jegyezni

Az alábbi feltételek vonatkozhatnak a System.Management.Automation.Provider.Containercmdletprovider.Newitem* implementációra:

Dinamikus paraméterek csatolása a Remove-Item parancsmaghoz

Előfordulhat, hogy a parancsmaghoz további paraméterekre van Remove-Item szükség, amelyek dinamikusan vannak megadva futásidőben. A dinamikus paraméterek megvalósításához a tárolószolgáltatónak implementálja a System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* metódust a paraméterek kezeléséhez. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett elérési úton, és egy olyan objektumot ad vissza, amely a parancsmagosztályhoz vagy a System.Management.Automation.Runtimedefinedparameterdictionary objektumhoz hasonló elemzési attribútumokkal rendelkezik. A Windows PowerShell futtatás a visszaadott objektummal adja hozzá a paramétereket a Remove-Item parancsmaghoz.

Ez a tárolószolgáltató nem implementálja ezt a metódust. A következő kód azonban a System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* alapértelmezett implementációja.

Gyermekelemek lekérdezése

Annak ellenőrzéséhez, hogy vannak-e gyermekelemek a megadott elérési úton, a Windows PowerShell-tárolószolgáltatónak felül kell bírálni a System.Management.Automation.Provider.Containercmdletprovider.Has childitems* metódust. Ez a metódus értéket true ad vissza, ha az elem gyermekekkel rendelkezik, és false egyéb esetben. Null vagy üres elérési út esetén a metódus az adattárban lévő összes elemet gyermeknek tekinti, és a értéket adja true vissza.

Itt található a System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* metódus felülbírálása. Ha a ChunkPath segítő metódusa több mint két elérésiút-részből áll, a metódus a értéket adja vissza, mivel csak egy adatbázis-tároló és egy false táblatároló van meghatározva. További információ erről a segítő metódusról: Creating a Windows PowerShell Item Provider (Új elemszolgáltató létrehozása) Windows PowerShell ChunkPath metódus.

protected override bool HasChildItems( string path )
{
    return false;
} // HasChildItems
        ErrorCategory.InvalidOperation, tableName));
}

return results;

A HasChildItems megvalósításával kapcsolatos dolgok

A következő feltételek vonatkozhatnak a System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* implementációra:

Elemek másolása

Az elemek másolásához a tárolószolgáltatónak implementálja a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem metódust a parancsmag hívásának Copy-Item támogatásához. Ez a metódus egy adatelemet másol a parancsmag paraméterével jelzett helyről a paraméter által jelzett path copyPath helyre. Ha a recurse paraméter meg van adva, a metódus az összes altárolót átmásolja. Ha a paraméter nincs megadva, a metódus csak egyetlen elemszintet másol.

Ez a szolgáltató nem implementálja ezt a módszert. A következő kód azonban a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem alapértelmezett implementációja.

A CopyItem megvalósításával kapcsolatos dolgok

Az alábbi feltételek vonatkozhatnak a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem implementációra:

Dinamikus paraméterek csatolása a Copy-Item parancsmaghoz

Előfordulhat, hogy a parancsmaghoz további paraméterekre van Copy-Item szükség, amelyek dinamikusan vannak megadva futásidőben. A dinamikus paraméterek megvalósításához a Windows PowerShell-tárolószolgáltatónak implementálja a System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* metódust a paraméterek kezeléséhez. Ez a metódus lekéri az elem paramétereit a jelzett elérési úton, és egy olyan objektumot ad vissza, amely a parancsmagosztályhoz vagy a System.Management.Automation.Runtimedefinedparameterdictionary objektumhoz hasonló elemzési attribútumokkal rendelkezik. A Windows PowerShell futtatás a visszaadott objektummal adja hozzá a paramétereket a Copy-Item parancsmaghoz.

Ez a szolgáltató nem implementálja ezt a módszert. A következő kód azonban a System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* alapértelmezett implementációja.

Kódminta

A teljes mintakódért lásd: AccessDbProviderSample04 – Kódminta.

A Windows PowerShell kiépítése

Lásd: How to Register Cmdlets, Providers, and Host Applications (Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása).

A Windows PowerShell tesztelése

Ha a Windows PowerShell-szolgáltató regisztrálva van a Windows PowerShell, tesztelheti a támogatott parancsmagok parancssoron való futtatásával. Vegye figyelembe, hogy az alábbi példakimenet egy fiktív Access-adatbázist használ.

  1. A Get-ChildItem parancsmag futtatásával lekéri a gyermekelemek listáját az Access-adatbázis Customers táblából.

    Get-ChildItem mydb:customers
    

    Az alábbi kimenet jelenik meg.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Futtassa Get-ChildItem újra a parancsmagot egy tábla adatainak lekéréséhez.

    (Get-ChildItem mydb:customers).data
    

    Az alábbi kimenet jelenik meg.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Most a parancsmag használatával lekéri az adattábla Get-Item 0. sorában lévő elemeket.

    Get-Item mydb:\customers\0
    

    Az alábbi kimenet jelenik meg.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. A 0. sorban lévő elemek adatainak Get-Item lekéréséhez használja újra.

    (Get-Item mydb:\customers\0).data
    

    Az alábbi kimenet jelenik meg.

    CustomerID   : 1234
    CompanyName  : Fabrikam
    ContactName  : Eric Gruber
    ContactTitle : President
    Address      : 4567 Main Street
    City         : Buffalo
    Region       : NY
    PostalCode   : 98052
    Country      : USA
    Phone        : (425) 555-0100
    Fax          : (425) 555-0101
    
  5. Most a parancsmag használatával adjon hozzá egy New-Item sort egy meglévő táblához. A paraméter megadja a sor teljes elérési útját, és olyan sorszámot kell jeleznie, amely nagyobb, mint a tábla meglévő Path sorai száma. A paraméter "row" (sor) értéket ad meg a hozzáadni Type kívánt elemtípus megadásához. Végül a paraméter egy oszlopértékeket tartalmazó vesszővel tagolt listát ad meg Value a sorhoz.

    New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Ellenőrizze az új elem műveletének helyességét az alábbiak szerint.

    PS mydb:\> cd Customers
    PS mydb:\Customers> (Get-Item 3).data
    

    Az alábbi kimenet jelenik meg.

    ID        : 3
    FirstName : Eric
    LastName  : Gruber
    Email     : ericgruber@fabrikam.com
    Title     : President
    Company   : Fabrikam
    WorkPhone : (425) 555-0100
    Address   : 4567 Main Street
    City      : Buffalo
    State     : NY
    Zip       : 98052
    Country   : USA
    

Lásd még:

Adatszolgáltatók Windows PowerShell létrehozása

A Windows PowerShell-szolgáltató tervezése

Elemcsoport-szolgáltató Windows PowerShell megvalósítása

Navigációszolgáltató Windows PowerShell megvalósítása

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

Windows PowerShell SDK

Windows PowerShell – programozói útmutató