WindowsタスクでGet-Credentialを実行するPowershellスクリプトを実行しても入力フォームがアクセス拒否になってしまう

20927774 110 評価のポイント
2024-07-31T23:19:10.67+00:00

WindowsEventLogに特定のイベントコードが発生した際にGet-Credentialにてパスワードを入力させたいと考えています。

そこで、Windowsタスクのトリガー条件の「タスクの開始」を「イベント時」に設定し、対象のイベントコードを登録しました。

対象の端末は、複数のユーザで共有しているため、複数アカウントが存在し、一般権限ユーザと管理者権限ユーザが存在しています。

どのユーザでも、特定イベント発生時は、Get-Credentialにてパスワード入力フォームを出したいです。

以下にテストしたパターンと結果を記載します。

1.Windowsタスクの「タスクの実行時に使うユーザアカウント」に、”System”を指定するとGet-Credentialのフォームが出力されないことがわかりました。(「最上位の特権で実行する」のチェック有無にかかわらず)

2.Windowsタスクの「タスクの実行時に使うユーザアカウント」に、”Users”を指定したところ、管理者権限を持つユーザでログオン時は、Get-Credentialのフォームが出力されることを確認しました。(「最上位の特権で実行する」のチェックが必須)

3.2.のパターンのまま、一般権限のユーザでログオンしなおして検証したところ、Get-Credentialの実行時に「アクセスが拒否されました」というエラーになりました。

※Windowsタスクから実行しているスクリプトをエクスプローラーから起動する分には正常にGet-Credentialのフォームは表示されます。

4.2.で管理者権限ユーザでは問題なく、3.の一般権限ユーザで「アクセスが拒否されました」となったため、Windowsタスクから実行されるスクリプト内部で管理者権限がない場合は、管理者権限に昇格して(※)再実行するような以下のコードを埋め込みましたが、結果は変わらず「アクセスは拒否されました」というエラーになりました。

(※)抜粋 ・・・ 以下で使っている$Credentialは管理者権限ユーザのもの。


if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) {

Start-Process powershell.exe -Credential $Credential -ArgumentList "Start-Process powershell.exe -ArgumentList ""-ExecutionPolicy RemoteSigned -File """"$PSCommandPath"""" -Verb RunAs"" "

}

Get-Credential -UserName $env:UserName -Message "パスワードを入力してください"


上記3のパターン(一般権限ユーザログオン時)に、Windowsタスクから実行されるスクリプト内に記載されているGet-Credentialのフォームを出力する際、「アクセスが拒否されました」というエラーを解消する方法についてアドバイスをいただきたくよろしくお願いいたします。

Windows
Windows
パーソナル コンピューター、タブレット、ノート PC、電話、モノのインターネット デバイス、自己完結型 Mixed Reality ヘッドセット、大規模なコラボレーション画面、その他のデバイスにわたって実行される Microsoft オペレーティング システムのファミリ。
101 件の質問
PowerShell
PowerShell
コマンドライン シェルと関連するスクリプト言語で構成される Microsoft タスク自動化および構成管理フレームワークのファミリ。
26 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 10,896 評価のポイント MVP
    2024-08-02T11:53:29.9866667+00:00

    試したらWindowsターミナルを既定のターミナルアプリケーションにしてると失敗した。 規定のターミナルアプリケーションをコンソールホストにするか、アプリ実行エイリアスでWindowsターミナルを無効にすると成功する。

    仕方ないからpowershell.exeからもう一段powershellを呼び出したらWindowsターミナルになっていても成功した。

    <?xml version="1.0" encoding="UTF-16"?>
    <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
      <RegistrationInfo>
        <Date>2024-08-02T00:00:00.0000000</Date>
        <Author>***\***</Author>
        <URI>\test</URI>
      </RegistrationInfo>
      <Triggers>
        <EventTrigger>
          <Enabled>true</Enabled>
          <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*[System[Provider[@Name='Application'] and EventID=1000]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    
          <ValueQueries>
            <!-- イベントを発生させたユーザーのSID -->
            <Value name="SID">Event/System/Security/@UserID</Value>
          </ValueQueries>
    
        </EventTrigger>
      </Triggers>
    
      <Principals>
        <Principal id="Author">
          <!--Users--> 
          <GroupId>S-1-5-32-545</GroupId>
          <RunLevel>LeastPrivilege</RunLevel>
        </Principal>
      </Principals>
    
      <Settings>
        <MultipleInstancesPolicy>Parallel</MultipleInstancesPolicy>
        <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
        <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
        <AllowHardTerminate>true</AllowHardTerminate>
        <StartWhenAvailable>false</StartWhenAvailable>
        <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
        <IdleSettings>
          <StopOnIdleEnd>true</StopOnIdleEnd>
          <RestartOnIdle>false</RestartOnIdle>
        </IdleSettings>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <Enabled>true</Enabled>
        <Hidden>false</Hidden>
        <RunOnlyIfIdle>false</RunOnlyIfIdle>
        <WakeToRun>false</WakeToRun>
        <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
        <Priority>7</Priority>
      </Settings>
    
      <Actions Context="Author">
    
        <Exec>
          <Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
          <Arguments>-Command add-content -Path S:\temp2\testlog.txt (get-childitem env:\username).value</Arguments>
        </Exec>
    
        <Exec>
          <Command>powershell.exe</Command>
          <Arguments>-Command Start-Process -FilePath Powershell.exe -ArgumentList 'Get-Credential $(SID)'</Arguments>
          <WorkingDirectory>C:\Windows\System32\WindowsPowerShell\v1.0\</WorkingDirectory>
        </Exec>
    
      </Actions>
    </Task>
    

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Ian Xue 39,286 評価のポイント Microsoft ベンダー
    2024-08-01T02:39:43.15+00:00

    こんにちは、

    Get-Credentialの実行に管理者権限は必要ありません。私は通常のローカルユーザーとしてスケジュールタスクを作成し、Get-Credentialコマンドレットは期待通りに実行されました。

    User's image

    Ian Xue


    回答が参考になった場合は、「回答を承認する」をクリックし、アップボートしてください。


お客様の回答

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