다음을 통해 공유


Windows PowerShell 드라이브 공급자 만들기

이 항목에서는 Windows PowerShell 드라이브를 통해 데이터 저장소에 액세스하는 방법을 제공하는 Windows PowerShell 드라이브 공급자를 만드는 방법을 설명합니다. 이러한 유형의 공급자를 Windows PowerShell 드라이브 공급자라고도 합니다. 공급자가 사용하는 Windows PowerShell 드라이브는 데이터 저장소에 연결하는 수단을 제공합니다.

여기에 설명된 Windows PowerShell 드라이브 공급자는 Microsoft Access 데이터베이스에 대한 액세스를 제공합니다. 이 공급자의 경우 Windows PowerShell 드라이브는 데이터베이스를 나타내고(드라이브 공급자에 드라이브 수를 추가할 수 있음), 드라이브의 최상위 컨테이너는 데이터베이스의 테이블을 나타내고 컨테이너의 항목은 테이블의 행을 나타냅니다.

Windows PowerShell 공급자 클래스 정의

드라이브 공급자는 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 공급자 디자인에 설명된 대로 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

이 메서드의 재정의는 다음을 수행해야 합니다.

NewDrive에 동적 매개 변수 연결

드라이브 공급자가 지원하는 New-PSDrive cmdlet에는 추가 매개 변수가 필요할 수 있습니다. 이러한 동적 매개 변수를 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 런타임이 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을 실행하여 테스트할 수 있습니다. 샘플 드라이브 공급자를 테스트해 보겠습니다.

  1. Get-PSProvider cmdlet을 실행하여 공급자 목록을 검색하여 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 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. 연결의 유효성을 검사합니다. 연결은 드라이브의 멤버로 정의되므로 Get-PDDrive cmdlet을 사용하여 확인할 수 있습니다.

    비고

    공급자는 해당 상호 작용에 컨테이너 기능이 필요하므로 사용자는 아직 공급자와 드라이브로 상호 작용할 수 없습니다. 자세한 내용은 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 공급자 만들기