Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается создание поставщика дисков 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, его можно протестировать, выполнив поддерживаемые командлеты в командной строке, включая все командлеты, доступные путем производных. Давайте протестируем пример поставщика дисков.
Запустите командлет
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}
Убедитесь, что имя сервера базы данных (DSN) существует для базы данных, доступ к источникам данных части средств администрирования для операционной системы. В таблице имени пользователя DSN дважды щелкните базу данных MS Access и добавьте путь к диску
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
Проверьте подключение. Так как подключение определяется как член диска, его можно проверить с помощью командлета 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 :
Удалите диск и закройте оболочку:
PS> Remove-PSDrive mydb PS> exit
См. также
создание поставщиков Windows PowerShell
проектирование поставщика Windows PowerShell
PowerShell