web-dev-qa-db-ja.com

PowerShellを使用してスケジュールされたタスクのインベントリを作成する方法

アクションを含め、PowerShellを使用してサーバー上のスケジュールされたタスクをインベントリするリンクまたはスクリプトを持っている人はいますか?

スケジュールされたサービスのcomオブジェクトと「トップレベル」のプロパティ(名前、状態、最終実行時間)を取得できますが、スケジュールタスクの「アクション」部分(基本的には名前)からも情報を取得したいと考えています。スケジュールされたタスクとそのコマンドラインの)。

例えば:

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0)

$tasks | select Name, LastRunTime

foreach ($t in $tasks)
{
foreach ($a in $t.Actions)
{
    $a.Path
}
}

上記のコードスニペットは、タスクのリストに関して機能します。しかし、アクションのループは単に何も実行せず、エラーも出力もありません。

任意の助けいただければ幸いです。

11
Margo Noreen

これはおそらく現在の回答と非常に似ていますが、私はあなたを先に進めるための簡単なスクリプトを書きました。現在のスクリプトの問題は、タスクにActionsプロパティがないことです。 comobjectが提供するxmlタスク定義からそれを抽出する必要があります。次のスクリプトは、スケジュールされたタスクごとに1つのオブジェクトの配列を返します。アクションアクションが1つ以上のコマンドを実行する場合が含まれます。それはあなたを手に入れるためだけのものなので、それらを必要とするなら、より多くのプロパティを含むように変更する必要があります。

function getTasks($path) {
    $out = @()

    # Get root tasks
    $schedule.GetFolder($path).GetTasks(0) | % {
        $xml = [xml]$_.xml
        $out += New-Object psobject -Property @{
            "Name" = $_.Name
            "Path" = $_.Path
            "LastRunTime" = $_.LastRunTime
            "NextRunTime" = $_.NextRunTime
            "Actions" = ($xml.Task.Actions.Exec | % { "$($_.Command) $($_.Arguments)" }) -join "`n"
        }
    }

    # Get tasks from subfolders
    $schedule.GetFolder($path).GetFolders(0) | % {
        $out += getTasks($_.Path)
    }

    #Output
    $out
}

$tasks = @()

$schedule = New-Object -ComObject "Schedule.Service"
$schedule.Connect() 

# Start inventory
$tasks += getTasks("\")

# Close com
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($schedule) | Out-Null
Remove-Variable schedule

# Output all tasks
$tasks

例出力の

PS > .\Untitled1.ps1 | ? { $_.Name -eq "test" }


Actions     : notepad.exe c:\test.txt
              calc.exe 
Path        : \test
Name        : test
LastRunTime : 30.12.1899 00:00:00
NextRunTime : 17.03.2013 13:36:38
13
Frode F.

W7 RKからPowerShellPackを入手し、get-scheduledtaskを試す

http://archive.msdn.Microsoft.com/PowerShellPack

MSDNからの抜粋:

Windows 7リソースキットのPowerShellパックには、PowerShellであらゆる種類の興味深いことを行うための10個のモジュールが含まれています。 Import-Module PowerShellPackは、実際に10個のモジュールをインポートして使用します。以下は、各モジュールの概要です。

  • [〜#〜] wpk [〜#〜]Windows PowerShellからリッチユーザーインターフェイスをすばやく簡単に作成します。 HTAを考えますが、簡単です。クイックユーザーインターフェイスの構築に役立つ600以上のスクリプト
  • TaskSchedulerスケジュールされたタスクの一覧表示、タスクの作成または削除
  • FileSystemファイルとフォルダを監視し、重複ファイルをチェックし、ディスク容量をチェックします
  • IsePack35以上のショートカットを使用して、統合スクリプト環境でスクリプトをスーパーチャージします
  • DotNetロードされたタイプの調査、タイプで機能するコマンドの発見、PowerShell、DotNet、COMの併用方法の調査
  • PSImageTools画像の変換、回転、拡大縮小、切り取り、画像メタデータの取得
  • [〜#〜] psrss [〜#〜]PowerShellからFeedStoreを利用します
  • PSSystemToolsオペレーティングシステムまたはハードウェア情報の取得
  • PSUserToolsシステムのユーザーを取得し、昇格を確認して、start-processaadministrator
  • PSCodeGenPowerShellスクリプト、C#コード、およびP/Invokeを生成します
1
mjolinor

私はパーティーに遅れていることはわかっていますが、@ Frode F.が提供する答えは、それが機能している間は技術的に正しくありません。

PowerShell経由でスケジュールされたタスクのActionsコレクションのアイテムにアクセスできますが、すぐにはわかりません。今日も自分でこれを理解しなければなりませんでした。

これは、XMLをいじる必要なしに、PowerShellでこれをすべて行うためのコードです。

_# I'm assuming that you have a scheduled task object in the variable $task:
$taskAction = $task.Definition.Actions.Item.Invoke(1) # Collections are 1-based
_

foreachを使用せずにコレクションから単一のアイテムを取得する方法は、これで全部です。

Actionsプロパティはパラメーター化されたプロパティItemを含むコレクションであるため(たとえば、C#では_myTask.Actions[0]_またはVB myTask.Actions.Item(1))、PowerShellはItemプロパティをPSParameterizedPropertyオブジェクトとして表します。プロパティに関連付けられているメソッドを呼び出すには、Invokeメソッドを使用します(ゲッター用)およびInvokeSetメソッド(セッター用)。

私はOPのコードを実行する簡単なテストを実行し、それは私のために機能しました(ただし、PowerShell 4.0を実行しているので、おそらくそれはそれと関係があります)。

_$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0)

$tasks | select Name, LastRunTime

foreach ($t in $tasks)
{
    foreach ($a in $t.Actions)
    {
        Write-Host "Task Action Path: $($a.Path)" # This worked
        Write-Host "Task Action Working Dir: $($a.workingDirectory)" # This also worked
    }

    $firstAction = $t.Actions.Item.Invoke(1)
    Write-Host "1st Action Path: $($firstAction.Path)"
    Write-Host "1st Action Working Dir: $($firstAction.WorkingDirectory)"
}
_

HTH。

1

もう1つの方法は、この記事で入手できるGet-ScheduledTask.ps1というスクリプトです。

ハウツー:PowerShellを使用してスケジュールされたタスクについてレポートする

この方法では、この単一のスクリプトのみが必要であり、他のものをダウンロードまたはインストールする必要はありません。

ビル

1
Bill_Stewart

ここに基づいて簡単なもの: https://blogs.technet.Microsoft.com/heyscriptingguy/2015/01/17/weekend-scripter-use-powershell-to-document-scheduled-tasks/

Powershellを使用:Get-ScheduledTaskおよびGet-ScheduledTaskInfo

### run like >>  Invoke-Command -ComputerName localhost, server1, server2 -FilePath C:\tmp\Get_WinTasks.ps1

$taskPath = "\"
$outcsv = "c:\$env:COMPUTERNAME-WinSchTaskDef.csv"
Get-ScheduledTask -TaskPath $taskPath |
    ForEach-Object { [pscustomobject]@{
     Server = $env:COMPUTERNAME
     Name = $_.TaskName
     Path = $_.TaskPath
     Description = $_.Description
     Author = $_.Author
     RunAsUser = $_.Principal.userid
    LastRunTime = $(($_ | Get-ScheduledTaskInfo).LastRunTime)
     LastResult = $(($_ | Get-ScheduledTaskInfo).LastTaskResult)
     NextRun = $(($_ | Get-ScheduledTaskInfo).NextRunTime)
     Status = $_.State
     Command = $_.Actions.execute
     Arguments = $_.Actions.Arguments }} |
     Export-Csv -Path $outcsv -NoTypeInformation
0
Tilo