Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой теме описывается, как создать провайдера дисков 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-PSDrivecmdlet.Проверьте объект 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, доступные по производному решению. Давайте протестируем провайдера дисков с образцами.
Запустите
Get-PSProvidercmdlet, чтобы получить список провайдеров и убедиться, что провайдер дисков 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}Убедитесь, что для базы данных существует имя сервера базы данных (DSN), обратившись к разделу «Источники данных » в разделе «Административные инструменты » операционной системы. В таблице User DSN дважды кликните по MS Access Database и добавьте путь
C:\ps\northwind.mdbк диску .Создайте новый диск с помощью провайдера образцов:
New-PSDrive -Name mydb -Root C:\ps\northwind.mdb -PSProvider AccessDb`Отображаются следующие результаты:
Name Provider Root CurrentLocation ---- -------- ---- --------------- mydb AccessDB C:\ps\northwind.mdbПроверьте подключение. Поскольку соединение определено как элемент диска, вы можете проверить это с помощью 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 :Снимите диск и выйдите из корпуса:
PS> Remove-PSDrive mydb PS> exit
См. также
Создание провайдеров Windows PowerShell