Поделиться через


Создание поставщика дисков Windows PowerShell

В этом разделе описывается создание поставщика дисков Windows PowerShell, который предоставляет способ доступа к хранилищу данных с помощью диска Windows PowerShell. Этот тип поставщика также называется поставщиками дисков Windows PowerShell. Диски Windows PowerShell, используемые поставщиком, предоставляют средства для подключения к хранилищу данных.

Поставщик дисков Windows PowerShell, описанный здесь, предоставляет доступ к базе данных Microsoft Access. Для этого поставщика диск Windows PowerShell представляет базу данных (можно добавить любое количество дисков к поставщику дисков), контейнеры верхнего уровня диска представляют таблицы в базе данных, а элементы контейнеров представляют строки в таблицах.

Определение класса поставщика Windows PowerShell

Поставщик дисков должен определить класс .NET, производный от базового класса System.Management.Automation.Provider.DriveCmdletProvider. Ниже приведено определение класса для этого поставщика дисков:

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

Обратите внимание, что в этом примере атрибут System.Management.Automation.Provider.КомандлетProviderAttribute указывает понятное имя поставщика и определенные возможности Windows PowerShell, предоставляемые поставщику во время обработки команд. Возможные значения возможностей поставщика определяются перечислением System.Management.Automation.Provider.ProviderCapabilities. Этот поставщик дисков не поддерживает какие-либо из этих возможностей.

Определение базовых функций

Как описано в конструкторепоставщика Windows PowerShell, класс System.Management.Automation.Provider.DriveCmdletProvider является производным от базового класса System.Management.Automation.Provider.КомандлетProvider, который определяет методы, необходимые для инициализации и неинициализации поставщика. Сведения о реализации функций для добавления сведений о инициализации для конкретного сеанса и освобождения ресурсов, используемых поставщиком, см. в созданиипоставщика Windows PowerShell basic. Однако большинство поставщиков (включая описанный здесь поставщик) могут использовать реализацию этой функции по умолчанию, предоставляемую Windows PowerShell.

Создание сведений о состоянии диска

Все поставщики Windows PowerShell считаются без отслеживания состояния, что означает, что поставщик дисков должен создавать любые сведения о состоянии, необходимые среде выполнения Windows PowerShell при вызове поставщика.

Для этого поставщика дисков сведения о состоянии включают подключение к базе данных, которая хранится в составе сведений о диске. Ниже приведен код, показывающий, как эти сведения хранятся в объекте System.Management.Automation.PSDriveinfo, описывающего диск:

internal class AccessDBPSDriveInfo : PSDriveInfo
{
    private OdbcConnection connection;

    /// <summary>
    /// ODBC connection information.
    /// </summary>
    public OdbcConnection Connection
    {
        get { return connection; }
        set { connection = value; }
    }

    /// <summary>
    /// Constructor that takes one argument
    /// </summary>
    /// <param name="driveInfo">Drive provided by this provider</param>
    public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
        : base(driveInfo)
    { }

} // class AccessDBPSDriveInfo

Создание диска

Чтобы разрешить среде выполнения Windows PowerShell создавать диск, поставщик дисков должен реализовать метод System.Management.Automation.Provider.DriveCmdletProvider.NewDrive*. В следующем коде показана реализация метода System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* для этого поставщика дисков:

      protected override PSDriveInfo NewDrive(PSDriveInfo drive)
      {
          // check if drive object is null
          if (drive == null)
          {
              WriteError(new ErrorRecord(
                  new ArgumentNullException("drive"), 
                  "NullDrive",
                  ErrorCategory.InvalidArgument, 
                  null)
              );
           
              return null;
          }
       
          // check if drive root is not null or empty
          // and if its an existing file
          if (String.IsNullOrEmpty(drive.Root) || (File.Exists(drive.Root) == false))
          {
              WriteError(new ErrorRecord(
                  new ArgumentException("drive.Root"), 
                  "NoRoot",
                  ErrorCategory.InvalidArgument, 
                  drive)
              );

              return null;
          }

          // create a new drive and create an ODBC connection to the new drive
          AccessDBPSDriveInfo accessDBPSDriveInfo = new AccessDBPSDriveInfo(drive);

          OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

          builder.Driver = "Microsoft Access Driver (*.mdb)";
          builder.Add("DBQ", drive.Root);
         
          OdbcConnection conn = new OdbcConnection(builder.ConnectionString);
          conn.Open();
          accessDBPSDriveInfo.Connection = conn;

          return accessDBPSDriveInfo;
      } // NewDrive

Переопределение этого метода должно выполняться следующим образом:

  • Убедитесь, что элемент System.Management.Automation.PSDriveinfo.Root* существует и можно ли подключиться к хранилищу данных.

  • Создайте диск и заполните член подключения в поддержку командлета New-PSDrive.

  • Проверьте объект System.Management.Automation.PSDriveinfo для предлагаемого диска.

  • Измените объект System.Management.Automation.PSDriveinfo, описывающий диск с любыми необходимыми сведениями о производительности или надежности, или предоставьте дополнительные данные для вызывающих устройств с помощью диска.

  • Обработка сбоев с помощью метода System.Management.Automation.Provider.КомандлетProvider.WriteError, а затем возвращает null.

    Этот метод возвращает сведения о диске, переданные методу или версии конкретного поставщика.

Присоединение динамических параметров к NewDrive

Командлет New-PSDrive, поддерживаемый поставщиком дисков, может потребовать дополнительных параметров. Чтобы подключить эти динамические параметры к командлету, поставщик реализует метод System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters*. Этот метод возвращает объект с свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System.Management.Automation.RuntimeDefinedParameterDictionary.

Этот поставщик дисков не переопределяет этот метод. Однако в следующем коде показана реализация этого метода по умолчанию:

Удаление диска

Чтобы закрыть подключение к базе данных, поставщик дисков должен реализовать метод System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive*. Этот метод закрывает подключение к диску после очистки всех сведений, относящихся к поставщику.

В следующем коде показана реализация метода System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* для этого поставщика дисков:

protected override PSDriveInfo RemoveDrive(PSDriveInfo drive)
{
    // check if drive object is null
    if (drive == null)
    {
        WriteError(new ErrorRecord(
            new ArgumentNullException("drive"), 
            "NullDrive",
            ErrorCategory.InvalidArgument, 
            drive)
        );

       return null;
    }

    // close ODBC connection to the drive
    AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;

    if (accessDBPSDriveInfo == null)
    {
        return null;
    }
    accessDBPSDriveInfo.Connection.Close();
  
    return accessDBPSDriveInfo;
} // RemoveDrive

Если диск можно удалить, метод должен вернуть сведения, передаваемые методу через параметр drive. Если диск не удается удалить, метод должен записать исключение, а затем вернуть null. Если поставщик не переопределяет этот метод, реализация этого метода по умолчанию просто возвращает сведения о диске, передаваемые в качестве входных данных.

Инициализация дисков по умолчанию

Поставщик дисков реализует метод System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* для подключения дисков. Например, поставщик Active Directory может подключить диск для контекста именования по умолчанию, если компьютер присоединен к домену.

Этот метод возвращает коллекцию сведений о инициализированных дисках или пустой коллекции. Вызов этого метода выполняется после вызова среды выполнения Windows PowerShell метода System.Management.Automation.Provider.КомандлетProvider.Start* для инициализации поставщика.

Этот поставщик дисков не переопределяет метод System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives*. Однако в следующем коде показана реализация по умолчанию, которая возвращает пустую коллекцию дисков:

Сведения о реализации InitializeDefaultDrives

Все поставщики дисков должны подключить корневой диск, чтобы помочь пользователю в обнаружении. Корневой диск может перечислять расположения, которые служат корневыми для других подключенных дисков. Например, поставщик Active Directory может создать диск, который перечисляет контексты именования, найденные в атрибутах namingContext в корневой среде распределенной системы (DSE). Это помогает пользователям обнаруживать точки подключения для других дисков.

Пример кода

Полный пример кода см. в примере кода AccessDbProviderSample02.

Тестирование поставщика дисков Windows PowerShell

Если поставщик Windows PowerShell зарегистрирован в Windows PowerShell, его можно протестировать, выполнив поддерживаемые командлеты в командной строке, включая все командлеты, доступные путем производных. Давайте протестируем пример поставщика дисков.

  1. Запустите командлет Get-PSProvider, чтобы получить список поставщиков, чтобы убедиться, что поставщик дисков AccessDB присутствует:

    PS>Get-PSProvider

    Отображаются следующие выходные данные:

    Name                 Capabilities                  Drives
    ----                 ------------                  ------
    AccessDB             None                          {}
    Alias                ShouldProcess                 {Alias}
    Environment          ShouldProcess                 {Env}
    FileSystem           Filter, ShouldProcess         {C, Z}
    Function             ShouldProcess                 {function}
    Registry             ShouldProcess                 {HKLM, HKCU}
    
  2. Убедитесь, что имя сервера базы данных (DSN) существует для базы данных, доступ к источникам данных части средств администрирования для операционной системы. В таблице имени пользователя DSN дважды щелкните базу данных MS Access и добавьте путь к диску C:\ps\northwind.mdb.

  3. Создайте новый диск с помощью примера поставщика дисков:

    New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`
    

    Отображаются следующие выходные данные:

    Name     Provider     Root                   CurrentLocation
    ----     --------     ----                   ---------------
    mydb     AccessDB     C:\ps\northwind.mdb
    
  4. Проверьте подключение. Так как подключение определяется как член диска, его можно проверить с помощью командлета Get-PDDrive.

    Примечание.

    Пользователь пока не может взаимодействовать с поставщиком в качестве диска, так как поставщику требуется функциональность контейнера для этого взаимодействия. Дополнительные сведения см. в созданиипоставщика контейнеров Windows PowerShell.

    PS> (Get-PSDrive mydb). подключения

    Отображаются следующие выходные данные:

    ConnectionString  : Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\ps\northwind.mdb
    ConnectionTimeout : 15
    Database          : C:\ps\northwind
    DataSource        : ACCESS
    ServerVersion     : 04.00.0000
    Driver            : odbcjt32.dll
    State             : Open
    Site              :
    Container         :
    
  5. Удалите диск и закройте оболочку:

    PS> Remove-PSDrive mydb
    PS> exit
    

См. также

создание поставщиков Windows PowerShell

проектирование поставщика Windows PowerShell

создание базового поставщика Windows PowerShell