Invoke-CommandでリモートPCのPowershellスクリプトをキックするとスクリプト内で実行しているConvertTo-SecureStringが「指定された状態で使用するには無効なキーです。」になってしまう

20927774 85 評価のポイント
2024-11-22T06:14:51.64+00:00

Workgroup環境で2台のPC(PC1、PC2とする)上に同一ユーザA(パスワードも同じ)を作成し、PC1からPC2上にあるPowershellスクリプト(test.ps1)をInvoke-Commnadで実行したいと考えています。

PC2には、ユーザAで作成した ConvertFrom-SecureStringを使って作成したユーザBのパスワードを保持しており、test.ps1内でこのパスワードをConvertTo-SecureStringで復元して、別PCの接続に利用しています。

PC2に、ユーザAでログインし、test.ps1を実行する分には問題なくパスワードが復元できますが、PC1からInvoke-CommandでPC2のtest.ps1を実行すると、題記の通り、Convertto-SecureString実行時に「指定された状態で使用するには無効なキーです。」のエラーが発生してしまいます。

test.ps1内で(Get-ChildItem Env:USERNAME).Valueを使って、実行ユーザを確認すると、ユーザAのアカウント名が表示されました。

しかし、ConvertTo-Securestringがエラーになるので、PC2では、ユーザAと判断されていないだと推測されます。

パスワードファイルの既存のものを使いながら、この問題を回避する方法がございましたら、ご教示頂きたくよろしくお願い致します。

Powershellのバージョンは5.1です。

Windows 11
Windows 11
生産性、創造性、使いやすさを考慮して設計された Microsoft オペレーティング システム。
7 件の質問
PowerShell
PowerShell
コマンドライン シェルと関連するスクリプト言語で構成される Microsoft タスク自動化および構成管理フレームワークのファミリ。
24 件の質問
0 件のコメント コメントはありません
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. チャブーン 1,631 評価のポイント MVP
    2024-11-27T02:29:25.4266667+00:00

    チャブーンです。

    この件ですが、文字列をSecureStringで暗号化して保存していると理解してます。

    でこれですが、仕様上「暗号キーはローカルコンピューター上にのみ存在する」という制約があります。つまり、他のマシンで実行する場合、復号はできない制約がある、理解です。

    ちなみに別コンピューターのアカウントは、セキュリティ的には別物となります。Windowsの「パススルー認証」という機能で、SMBアクセス(Windows認証)の便宜上、アカウント名とパスワード文字が同じなら同じユーザーとして扱う、というルールになっているだけです。

    こちらはユーザーマジックで何とかする、とはムリだと思いますので、別のやり方が必要だと思います。

    • PC1からPC2にSMBセッションを開く(SMB3.0の暗号セッションを使います)
    • PC1でパスワードを復号して、PC2のSMBに平文パスワードが書かれたファイルを生成
    • PC2で生成されたファイルをリアルタイムに「検出」して以下の動作を自動実行させる
      • 生成ファイルから平文パスワードを読み込む
      • SecureString化して別のファイルを生成する
      • 元の生成ファイルを削除する

    そうすれば、パスワード文字列を見られることなく、対応が可能なのではないでしょうか?特定フォルダー内で「(コピー・移動等も含め)ファイルが生成された」を検出するにはWMIの

    __InstanceCreationEventクラスを使うと可能です。これを実際に使ったファイル検出とそのアクション(検出後に何をさせるのか)について、サンプルがあるようですので、以下を見ていただくといいかと思います。

    https://ravichaganti.com/blog/monitoring-file-creation-using-wmi-and-powerevents-module/

    0 件のコメント コメントはありません

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。