이 주제는 Windows PowerShell 드라이브를 통해 데이터 저장소에 접근할 수 있는 Windows PowerShell 드라이브 제공자를 만드는 방법을 설명합니다. 이러한 유형의 제공자는 Windows PowerShell 드라이브 제공자라고도 불립니다. 제공자가 사용하는 Windows PowerShell 드라이브는 데이터 저장소에 연결할 수 있는 수단을 제공합니다.
여기서 설명하는 Windows PowerShell 드라이브 제공자는 Microsoft Access 데이터베이스에 접근할 수 있습니다. 이 제공자의 경우, Windows PowerShell 드라이브는 데이터베이스를 나타내며(드라이브 제공자에게 원하는 수의 드라이브를 추가할 수 있음), 드라이브의 최상위 컨테이너는 데이터베이스 내 테이블을, 컨테이너의 항목들은 테이블의 행을 나타냅니다.
Windows PowerShell Provider 클래스 정의
드라이브 제공자는 System.Management.Automation.Provider.DriveCmdletProvider 기본 클래스에서 파생된 .NET 클래스를 정의해야 합니다. 다음은 이 드라이브 제공자의 클래스 정의입니다:
[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하세요.제안된 드라이브에 대해 System.Management.Automation.PSDriveinfo 객체를 검증하세요.
드라이브를 설명하는 System.Management.Automation.PSDriveinfo 객체에 필요한 성능 또는 신뢰성 정보를 포함하거나, 드라이브를 사용하는 사용자를 위한 추가 데이터를 제공하세요.
System.Management.Automation.Provider.CmdletProvider.WriteError 메서드를 사용하여 실패를 처리한 후
null.이 메서드는 전달된 드라이브 정보나 제공자별 버전을 반환합니다.
NewDrive에 동적 매개변수 부착하기
드라이브 제공자가 지원하는 cmdlet은 New-PSDrive 추가 매개변수를 요구할 수 있습니다. 이 동적 매개변수를 명령어에 첨부하기 위해 제공자는 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 런타임이 System.Management.Automation.Provider.CmdletProvider.Start* 메서드를 호출하여 제공자를 초기화한 후에 이루어집니다.
이 드라이브 제공자는 System.Management.Automation.Provider.DriveCmdletProvider.InitializeDefaultDrives* 메서드를 덮어쓰지 않습니다. 하지만 다음 코드는 기본 구현을 보여주며, 빈 드라이브 컬렉션을 반환합니다:
InitializeDefaultDrives 구현에 대해 기억해야 할 점
모든 드라이브 제공업체는 사용자가 발견 편리하도록 루트 드라이브를 마운트해야 합니다. 루트 드라이브는 다른 마운트된 드라이브의 루트 위치를 나열할 수 있습니다. 예를 들어, Active Directory 제공자는 루트 분산 시스템 환경(DSE)의 속성에 있는 namingContext 명명 컨텍스트를 나열하는 드라이브를 생성할 수 있습니다. 이 기능은 사용자가 다른 드라이브의 마운트 지점을 찾는 데 도움을 줍니다.
코드 샘플
전체 샘플 코드는 AccessDbProviderSample02 코드 샘플을 참조하세요.
Windows PowerShell 드라이브 제공자 테스트
Windows PowerShell 제공자가 Windows PowerShell에 등록되면, 명령줄에서 지원되는 cmdlet을 실행하여 테스트할 수 있습니다. 파생 명령어로 제공되는 cmdlet도 포함해서요. 샘플 드라이브 제공자를 테스트해 봅시다.
AccessDB 드라이브 제공자가 존재하는지 확인하기 위해 명령어를
Get-PSProvider실행하여 제공자 목록을 가져오세요:추신>
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 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연결의 유효성을 검사합니다. 연결이 드라이브의 멤버로 정의되어 있으니 Get-PDDrive cmdlet을 사용해 확인할 수 있습니다.
비고
사용자는 아직 드라이브로서 공급자와 상호작용할 수 없으며, 공급자는 그 상호작용을 위해 컨테이너 기능이 필요하기 때문입니다. 자세한 내용은 Windows PowerShell 컨테이너 프로바이저 만들기를 참조하세요.
추신> (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