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


Создание провайдера диска для Windows PowerShell

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

Поставщик дисков 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.CmdletProviderAttribute указывает удобное имя для провайдера и специфические для Windows PowerShell возможности, которые провайдер открывает для Windows PowerShell во время обработки команд. Возможные значения возможностей провайдера определяются перечислением System.Management.Automation.Provider.ProviderCapabilities . Этот поставщик дисков не поддерживает ни одну из этих возможностей.

Определение базовой функциональности

Как описано в статье «Проектируйте ваш Windows PowerShell Provider», класс System.Management.Automation.Provider.DriveCmdletProvider происходит из базового класса System.Management.Automation.Provider.CmdletProvider , который определяет методы, необходимые для инициализации и снятия инициализации провайдера. Чтобы реализовать функционал добавления информации о инициализации, специфичной для сессии, и для выпуска ресурсов, используемых провайдером, см. раздел «Создание базового провайдера Windows PowerShell». Однако большинство провайдеров (включая описанного здесь провайдера) могут использовать стандартную реализацию этой функции, предоставляемую 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 cmdlet.

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

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

  • Обрабатывайте сбои с помощью метода System.Management.Automation.Provider.CmdletProvider.WriteError , а затем возвращайте null.

    Этот метод возвращает либо информацию о диске, переданную методу, либо его версию, специфичную для провайдера.

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

Cmdlet, поддерживаемый New-PSDrive вашим провайдером диска, может требовать дополнительных параметров. Для прикрепления этих динамических параметров к cmdlet провайдер реализует метод System.Management.Automation.Provider.DriveCmdletProvider.NewDriveDynamicParameters* . Этот метод возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект 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 runtime вызывает метод System.Management.Automation.Provider.CmdletProvider.Start* для инициализации провайдера.

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

Что нужно помнить о реализации InitializeDefaultDrives

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

Пример кода

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

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

Когда ваш провайдер Windows PowerShell зарегистрирован в Windows PowerShell, вы можете проверить это, запустив поддерживаемые cmdlets в командной строке, включая все cmdlet, доступные по производному решению. Давайте протестируем провайдера дисков с образцами.

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

    P.S.>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), обратившись к разделу «Источники данных » в разделе «Административные инструменты » операционной системы. В таблице User DSN дважды кликните по MS Access Database и добавьте путь 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. Проверьте подключение. Поскольку соединение определено как элемент диска, вы можете проверить это с помощью cmdlet Get-PDDrive.

    Замечание

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

    P.S> . (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