none
UnProtect-RMSFile コマンドでエラー

    質問

  • ファイルサーバリソースマネージャーのファイル管理タスクを利用して、RMSによるファイル自動保護とファイル自動解除の仕組みを作成しようとしています。

    RMSで保護するスクリプトは問題なく動作しているのですが、保護解除スクリプトがうまく動作しません。

    サービスプリンシパルは同じものを利用しており、自動保護スクリプトで保護したファイルを、保護解除用スクリプトで解除しようとしているだけです。

    ログを確認すると、UnProtect-RMSFile を実行した際に、以下のようなエラーが出ています。

    UnProtect-RMSFile : Error decrypting TEST02.ptxt with error: Rights Management
    サービスが Windows システム ファイルを保護できないため、操作は失敗しました。 HRESULT: 0x80041000
       場所 Microsoft.InformationProtectionAndControl.SafeNativeMethods.ThrowOnErrorC
    ode(Int32 hrError)
       場所 Microsoft.InformationProtectionAndControl.SafeFileApiNativeMethods.IpcfDe
    cryptFile(String inputFile, DecryptFlags flags, Boolean suppressUI, Boolean off
    line, Boolean hasUserConsent, IntPtr parentWindow, SymmetricKeyCredential symmK
    ey, String outputDirectory, WaitHandle cancelCurrentOperation)
       場所 RMSProtection.Core.Protection.FileProtection.DecryptFile(Boolean suppresU
    i, String sourceFile, FileUnProtectionConfig config, String outputPath)
       場所 RMSProtection.Core.Protection.FileProtection.UnprotectTopLevelFile(Boolea
    n suppresUi, String sourceFile, FileUnProtectionConfig config)
       場所 RMSProtection.Core.Protection.Decryptor.Decrypt(Component component, File
    UnProtectionConfig config)
    発生場所 C:\RMSProtection\RMS-UnProtect-FCI.ps1:129 文字:32
    + ... ectReturn = UnProtect-RMSFile -File $ffile -InPlace > C:\RMSProtectio ...
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [Unprotect-RMSFile], RMSExcept
       ion
        + FullyQualifiedErrorId : 502,Microsoft.Protection.PowerShell.UnProtectRMS
       File
     

    下記サイトには、

    「ファイルの保護を解除するには、所有者または抽出者の権利が必要です。」

    と記載がありますが、保護解除はファイル管理タスクを利用しての利用はできなかったりしますでしょうか?

    https://translate.googleusercontent.com/translate_c?depth=1&hl=ja&prev=search&rurl=translate.google.co.jp&sl=en&sp=nmt4&u=https://msdn.microsoft.com/en-us/library/mt433202.aspx&usg=ALkJrhhR8BvtQHXMVpC3Y5vN3PTNs419vg

    何かご存知の方がいらっしゃいましたら、情報をいただけますと助かります。

    よろしくお願い致します。

    2017年2月21日 9:43

すべての返信

  • いろいろ試しているのですが、UnProtect-RMSFileコマンドは、RMSテンプレートの所有者権限を持っているアカウントで、管理者として実行する必要があるようです。

    タスクスケジューラで、上記条件になるように実行者を指定して保護解除用スクリプトを実行すれば問題なく動作します。
    ファイルサーバリソースマネージャーのファイル管理タスクにおいて、特定のアカウントで管理者権限でスクリプトを実行することができればうまくいきそうなのですが。。。

    PowerShellで、特定のアカウントで管理者権限で実行する方法があれば、何とかなりそうなのですが、ご存知の方はいらっしゃいますでしょうか?
    2017年2月22日 5:36
  • タスクスケジューラの登録タスクであれば実行可能なのであれば、そのタスクをPowerShellから実行してあげるのはどうでしょうか?

    Start-ScheduledTaskコマンドレットが利用できます。ただしWindows Server 2012以降のみです。

    2017年2月23日 7:08
    モデレータ
  • ファイル管理タスクの「新しいファイルに対して連続実行する」というのが使いたくて、1ファイル単位に処理を実行させたいのですが、Start-ScheduledTask に引数でファイル名を渡して、Start-ScheduledTaskで実行するスクリプトで、そのファイル名を参照することは可能かご存知でしょうか?

    2017年2月23日 9:43
  • ファイル管理タスクのコマンド引数に、[Source File Path]という、新しいファイルのパスを表す変数が使えるようなので、これを利用すれば実現しそうです。

    ただしStart-ScheduledTaskでは引数を指定することはできないと思います。

    そのため、考えられる方法としては…

    ファイル管理タスクのアクションとして実行されるスクリプトでは、[Source File Path]の中身をどこかに書き出した後にStart-ScheduledTaskを実行。

    一方、Start-ScheduledTaskで実行される側のスクリプト内では、先ほど書き出しておいたファイルパスを読み込む、のような方法が必要になってくると思います。

    どこにファイル名の情報を書き出すかというのは、真っ先に思いつくのはテキストファイル経由になると思いますが、排他制御をうまくやらないとおかしなことになるかと思います。

    あまりスマートな方法ではないですが、なにぶんWindowsでUACを有効にした状態で、ダイアログを出さずに任意ユーザーの管理者権限でプログラムを走らせる方法はあまり選択肢がないので、「ファイル管理タスク」にその機能が無い以上はこういった迂遠な方法を取らざるを得ないのではないかと思います。

    管理者権限が必要ないのであれば、Start-Process -Credentialを使えば良いのですけども。

    2017年2月23日 11:49
    モデレータ
  • なるほど。ファイル名を書き出すという、ちょっと面倒なことをやらないといけないのですね。
    実現案の1つとして、選択肢に入れさせていただきます。

    スマートにできなさそうであれば、タスクスケジューラで1分間隔で処理する方法で妥協しようかとも考えています。

    返信ありがとうございました。
    2017年2月23日 23:50