web-dev-qa-db-ja.com

Powershellスクリプトがスケジュールされたタスクを介して実行されない

ドメインコントローラに小さなスクリプトがあり、最新のセキュリティイベント4740についてSMTP経由でメールを送信するように設定されています。

スクリプトは、手動で実行されると、意図したとおりに実行されます。ただし、スケジュールされたタスクを介して実行するようにセットアップし、実行されたように見えても、何も起こりません(電子メールなし)。

スクリプトは次のとおりです。

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

$Event = Get-EventLog -LogName Security -InstanceId 4740 -Newest 5
$MailBody= $Event.Message + "`r`n`t" + $Event.TimeGenerated

$MailSubject= "Security Event 4740 - Detected"
$SmtpClient = New-Object system.net.mail.smtpClient
$SmtpClient.Host = "smtp.domain.com"
$MailMessage = New-Object system.net.mail.mailmessage
$MailMessage.from = "[email protected]"
$MailMessage.To.add("toemail.domain.com")
$MailMessage.IsBodyHtml = 1
$MailMessage.Subject = $MailSubject
$MailMessage.Body = $MailBody
$SmtpClient.Send($MailMessage)

スケジュールされたタスクは次のように設定されます:

RunsAs:LOCAL SYSTEM

Trigger: On event - Log: Security, Event ID: 4740

Action:  Start Program - C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

  Argument:  -executionpolicy bypass c:\path\event4740.ps1

私も次のことを試しました:

Trigger: On event - Log: Security, Event ID: 4740

Action:  Start Program - C:\path\event4740.ps1

タスク履歴によると:タスク開始、アクション開始、タスクプロセス作成、アクション完了、タスク完了。私は同じ「問題」でサイト上のいくつかのさまざまなリンクを調べましたが、それらはすべて私が持っていないある種の変数を持っているようです。また、上記のソリューションのいくつかを、それらが多少関連している可能性があると考えて試しましたが、残念ながら何も機能していません。ここで述べたように、スケジュールされたタスクを削除してリセットすることさえ試みました: http://blogs.technet.com/b/heyscriptingguy/archive/2012/08/11/weekend-scripter-use-the-windows -task-scheduler-to-run-a-windows-powershell-script.aspx

誰もこのタイプのエラーに遭遇する前に、またはこの問題を回避する方法を知っていますか?

トラブルシューティング:

スケジュールされたタスクを介して.batファイルの呼び出しを試みることにしました。現在の日付/時刻を監視フォルダーにエコーする単純なファイルを作成しました。 4740イベントによってトリガーされたタスクを介して手動でファイルを実行すると、望ましい結果が得られました。 .batファイルを変更して、代わりに.ps1ファイルを呼び出すことは手動で行いました。 4740イベントによってトリガーされると、.batは実行されなくなります。

22
ThinkSpace

私のシナリオに適用可能な成功した回避策が見つかりました:

ログオフせずに、セッションをロックするだけです!

このスクリプトはドメインコントローラーで実行されているため、リモートデスクトップコンソール経由でサーバーにログインし、サーバーからログオフしてセッションを終了しています。タスクスケジューラでタスクを設定するときに、オフラインモードで実行するためのアクセス権や、厳密にスクリプトを実行するためのログオン権を持たないユーザーアカウントとローカルサービスを使用していました。

Coleからのトラブルシューティング支援のおかげで、RunAs機能について考えることになり、機能しないログオンを回避することにしました。

タスクスケジューラで開始し、手動で作成したタスクを削除しました。 Server 2008 R2の新機能を使用して、イベントビューアーで4740セキュリティイベントに移動し、右クリック> [このイベントにタスクを添付...]を使用し、プロンプトに従って[アクション]ページのスクリプトを指定しました。タスクが作成された後、セッションをロックし、リモートデスクトップコンソール接続を終了しました。プロファイルが「ロック」されており、ログオフされていない場合、すべてが正常に機能します。

2
ThinkSpace

アクションを次のように変更します。

powershell -noprofile -executionpolicy bypass -file C:\path\event4740.ps1

Windows 2008サーバーR2の場合:[タスクスケジューラ]の[全般]タブ-[実行]ユーザーが、スクリプトの実行に必要な適切なアクセス許可を持つアカウントに設定されていることを確認します。

また、「ユーザーがログオンしているときのみ実行する」オプションがオフになっていると思います。これを「ユーザーがログオンしているかどうかに関係なく実行する」に変更します。 [パスワードを保存しない]オプションをオフのままにしておくと、おそらく[最高の特権で実行する]オプションをマークする必要があります。

29
Cole9350

あなたはすでにあなたの問題の解決策を見つけているかもしれませんが、私はまだ他の誰かのためにこのメモを投稿するつもりです。同様の問題に遭遇しました。基本的に、テストと比較に別のドメインアカウントを使用しました。 「ユーザーがログオンしているかどうかに関係なく実行する」にチェックマークを付けて、タスクが正常に実行されました。

次のことを念頭に置いて、次のことを確認してください。

  1. タスクの実行に使用するアカウントには、サーバーのローカルセキュリティポリシー(またはローカル管理グループのメンバー)で「バッチジョブとしてログオン」権限が必要です。スクリプト/ batファイルを実行するために必要なアカウントを指定する必要があります。
  2. 正しいパスワード文字を入力していることを確認してください
  3. 2008 R2のタスクは、「ユーザーがログオンしているかどうかに関係なく実行する」として実行した場合、特別に対話的に実行されません。 powershellセッションが開始するためにその情報を必要とするため、タスクが作成されたときにユーザープロファイルに固有のオブジェクトまたはリソースを探しているスクリプトで特に失敗する可能性があります。スクリプトを「ユーザーがログオンしているかどうかに関係なく実行する」ときに$ Pathを定義する例として、マップされたドライブを指定します。タスクが開始されるとそのドライブを探しますが、タスクを実行するために検証されたユーザーアカウントはログインされておらず、スクリプトに対して参照しているので、それに対して動作する必要があるsource\objectは存在しません終了するだけです。マップされたドライブ(\ server\share)x:\ vs.実際のUNCパス\ server\share
  4. 手順、スクリプト、引数を確認します。このプロセスを何度も行ったとしても、最小の部分が大きな違いを生むことがあります。パスワードやセミコロンを入力するときに、スクリプトやタスクを作成するときに文字を数回見逃しました。

このリンクを確認してください。うまくいけば、あなたや他の誰かがこの情報の恩恵を受けることができます。 https://technet.Microsoft.com/en-us/library/cc722152.aspx

6
Prognox

「管理者として実行」機能を実現するために、フラグを実装しました。

-ExecutionPolicy Bypass

これは、Powershellファイルの実行時にのみ有効になるようです。そのため、コマンドを.ps1ファイルにドロップし、-ExecutionPolicy Bypassを指定して実行すると、スケジュールされたタスクは期待どおりに動作します。

Program: Powershell.exe
Add Arguments: -ExecutionPolicy Bypass -File C:\pscommandFile.ps1
2
Case 303

エラーメッセージがなく、問題の内容がわからない場合-PowerShellスクリプトがスケジュールされたタスクから開始したくない理由は、次の手順を実行して回答を取得します。

  1. PowerShellスクリプトを実行するために、スケジュールされたタスクに設定されているユーザーとしてCMDを実行します
  2. PowerShellスクリプトがあるフォルダーを参照します
  3. PowerShellスクリプトを実行します($ ErrorActionPreference = 'silentlycontinue'などのスクリプト内にエラー通知が存在する場合、エラー通知をブロックするすべてのステートメントを削除します)

すべてのエラー通知を表示できるはずです。

私のスクリプトの1つの場合:

「タイプ[System.ServiceProcess.ServiceController]が見つかりません。このタイプを含むアセンブリがロードされていることを確認してください。」

この場合、不足しているアセンブリを読み込むために、スクリプトの先頭に追加の行を追加する必要があります。

Add-Type -AssemblyName "System.ServiceProcess"

そして次のエラー:

「1」引数で「GetServices」を呼び出す例外:「コンピューター ''でサービスコントロールマネージャーを開けません。この操作には他の特権が必要な場合があります。」

select:プロパティ「データベース名」が既に存在するため、プロパティを処理できません

次を見つけた場合、私は最終的に解決策のために2日間さまよっていました:

1)powershell.exeをこの管理者として実行する

  1. powershell.exeアイコンを右クリックします
  2. ショートカットキーの下のプロパティをクリックします
  3. アドバンスボタンをクリックして、管理者がチェックしたとおりに実行を確認します。

2)アクチンペインの下のタスクスケジューラウィンドウで、新しいコマンドとして次のスクリプトを追加します。

%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NonInteractive -ExecutionPolicy Bypass -noexit -File "C:\ps1\BackUp.ps1"
1

上記のアドバイスに加えて、エラーが発生し、次のリンクで解決策を見つけました http://blog.vanmeeuwen-online.nl/2012/12/error-value-2147942523-on-scheduled.html

また、これは助けることができます:

タスクスケジューラで、スケジュールされたジョブプロパティをクリックしてから、設定をクリックします。

最後にリストされたオプション:「タスクが既に実行されている場合、次のルールが適用されます」:ドロップダウンリストから「既存のインスタンスを停止」を選択します。

1
Denis Besic

これに対する答えも関連があると思います:

スケジュールされたタスクが「最後の実行時間」を正しく更新し、「(0x0)」の「最後の実行結果」を与えるのに実際には機能しないのはなぜですか

概要:Windows 2012スケジュールタスクは、notPATHを含む正しい環境変数を参照します、タスクを実行するように設定されているアカウントの場合。しかし、これをテストすることができ、それが起こっている場合、何が起こっているかを理解したら、それを回避することができます。

1
Mike Beaton

WIN 10でこの問題が発生している場合、これは私と同じようにurの問題を解決するかもしれません。更新がタスクスケジューラを混乱させました。

http://answers.Microsoft.com/en-us/windows/forum/windows_10-performance/anniversary-update-version-1607-build14393-breaks/d034ab52-5d49-4b92-976a-a1355b5a6e6d?page= 2

このコメントは私の問題を解決しました。

「「1回限りの」タスクに関するヒントは非常に効果的です。MSが問題を修正するまでの回避策としては間違いなく十分です。私が見る限り、「毎日」の唯一の利点は、実行時間に関連付けられた任意の日付がないことです。ジョブがX日に開始するように設定されている理由について、他の人を混乱させるかもしれません。

トリガー設定「Einmal」は「1回限り」を意味し、「Sofort」は「一度に」を意味します

0

Cole935 で示されているように、引数が小文字であることを確認してください

0
Jasmin

私は非常に似た問題を抱えていました、私はスケジュールタスクを手動で実行するときに常にPowerShellスクリプトでVSCウィンドウを保持していました。ただ閉じて、期待通りに動き始めました。

0
Viral

私の場合(同じ問題)、私のサーバーではUACがオン(アクティブ)であるため、タスクアクションコマンド引数に-NoProfileを追加し、「最高の権限で実行」チェックボックスをオンにしました。

それに関する詳細情報 ここにリンクの説明を入力してください

0
Ebodas

働いたもう一つのアイデア。本当にばかげていますが、明らかに、デフォルトのターゲットOS設定(画面の右下隅)はVista / Windows Server 2008。 10年を過ぎているため、Powershellスクリプトはこれらと互換性がない可能性があります。

下のスクリーンショットに示すように、ターゲットをWindows Server 2016に変更すると、私にとってはうまくいきました。

Change the setting on the screenshot

0
Vadim Berman

私はこれとほとんど同じ問題を抱えていましたが、Server 2012 R2ではわずかに異なっていました。タスクスケジューラにある場所から別の場所に3つのファイルをコピーするPowerShellスクリプトがあります。 powershellからスクリプトを手動で実行すると、魅力のように機能します。ただし、タスクスケジューラから実行すると、最初の2つの小さなファイルのみがコピーされ、3番目(大きなファイル)でハングします。また、「オペレーターまたは管理者がリクエストを拒否しました」という結果も得ていました。そして、私はこのフォーラムでほぼすべてを行った。

シナリオと、それをどのように修正したかを以下に示します。他の人には機能しないかもしれませんが、念のため:

シナリオ:1.タスクスケジューラのPowershellスクリプト2.サーバーのローカル管理者であるドメインアカウントを使用して実行しました3. [ユーザーがログオンしているかどうかに関係なく実行する]を選択します。

修正:1.ドメインアカウントを使用してサーバーにログインして、C:\ Usersにローカルプロファイルを作成する必要がありました。 2.ユーザーがスクリプトで参照したすべてのドライブにアクセスできることを確認してユーザーにした

#1が私にとっての主な修正だと思います。これが他の人にも役立つことを願っています。

0
Glen

この問題に対する別の解決策があります。それはあなたの何人かに当てはまるかもしれません。

Power Shell(xyz.ps1)スクリプトを作成した後、後で編集するためにメモ帳で開きました。したがって、Windowsはxyz.ps1ファイルをnotepad.exeと関連付け、スケジューラはPowershellで実行するのではなく、バックグラウンドでnotepad.exeを使用してPower Shellスクリプト(xyz.ps1)を実行しようとしました。スケジューラーの「実行中のすべてのタスクを表示する」セクションに細心の注意を払うことで、この問題を発見しました。notepad.exeがxyz.ps1スクリプトの実行に使用されていることがわかりました。これを確認するために、Windowsエクスプローラーでxyz.ps1ファイルを右クリックし、[プロパティ]に移動して、[開く]セクションに対してメモ帳を表示しました。次に、「Opens With」を%SystemRoot%\ SysWOW64\WindowsPowerShell\v1.0\powershell.exeに変更しました。これでうまくいきました。これで、スケジューラーはpowershell.exeを使用してxyz.ps1を実行し、必要な結果が得られました。

Powershell.exeを見つけるには、この記事を参照してください: https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations

0
RaviB