web-dev-qa-db-fra.com

comment utiliser PowerShell pour inventorier les tâches planifiées

Quelqu'un a-t-il un lien ou un script qui utilise PowerShell pour inventorier les tâches planifiées sur un serveur, y compris l'action?

Je peux obtenir l'objet com Service programmé et ce que j'appellerais des propriétés "de premier niveau" (nom, état, lastruntime), mais j'aimerais également obtenir des informations à partir de la partie "Actions" de la tâche programmée (essentiellement, le nom de tâche programmée et sa ligne de commande).

Par exemple:

$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
}
}

L'extrait de code ci-dessus fonctionne en termes de listage des tâches; mais la boucle sur les actions ne semble tout simplement pas faire quoi que ce soit, aucune erreur, aucune sortie.

Toute aide serait appréciée.

9
Margo Noreen

Ceci est probablement très similaire aux réponses actuelles, mais j’ai écrit un script rapide pour vous aider. Le problème avec votre script actuel est qu’il n’ya pas de propriété Actions dans une tâche. Vous devez l'extraire de la définition de tâche xml fournie par le comobject. Le script suivant renverra un tableau d'objets, un par tâche planifiée. Cela inclut l'action si l'action consiste à exécuter une ou plusieurs commandes . C'est juste pour vous aider, vous devez donc le modifier pour inclure plus de propriétés si vous en avez besoin.

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

Ex. de sortie

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.

Procurez-vous le PowerShellPack à partir du W7 RK et essayez get-scheduletask

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

Extrait de MSDN:

Le pack PowerShell du Kit de ressources Windows 7 contient 10 modules permettant d'effectuer toutes sortes d'activités intéressantes avec PowerShell. Import-Module PowerShellPack importe en fait 10 modules à utiliser. Voici un bref aperçu de chacun des modules.

  • WPK Créez des interfaces utilisateur riches rapidement et facilement à partir de Windows PowerShell. Pensez HTA, mais facile. Plus de 600 scripts pour vous aider à construire des interfaces utilisateur rapides
  • TaskScheduler Répertoriez les tâches planifiées, créez ou supprimez des tâches
  • FileSystem Surveiller les fichiers et les dossiers, rechercher les fichiers en double et vérifier l'espace disque
  • IsePack Augmentez vos scripts dans l'environnement de script intégré avec plus de 35 raccourcis
  • DotNet Explorez les types chargés, trouvez des commandes pouvant fonctionner avec un type et explorez comment vous pouvez utiliser PowerShell, DotNet et COM ensemble.
  • PSImageTools Convertir, faire pivoter, mettre à l'échelle et rogner des images et obtenir des métadonnées d'image
  • PSRSS Exploitez le FeedStore de PowerShell
  • PSSystemTools Obtenir des informations sur le système d'exploitation ou le matériel
  • PSUserTools Obtenir les utilisateurs sur un système, vérifier l'élévation et démarrer processaadministrator
  • PSCodeGen Génère des scripts PowerShell, du code C # et P/Invoke
1
mjolinor

Je sais que je suis en retard à la fête, mais la réponse fournie par @Frode F., bien que cela fonctionne, est techniquement incorrecte.

Vous pouvez accéder aux éléments de la collection Actions d'une tâche planifiée via PowerShell. Cela n'est tout simplement pas évident. Je devais comprendre cela moi-même aujourd'hui.

Voici le code pour tout faire dans PowerShell, sans avoir à vous soucier de XML:

# 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

C'est tout ce qu'il y a à faire pour sortir un seul article de la collection sans utiliser foreach

La propriété Actions étant une collection contenant une propriété paramétrée Item (par exemple, en C #, vous écririez myTask.Actions[0] ou dans VB myTask.Actions.Item(1)), PowerShell représente la propriété Item en tant qu'objet PSParameterizedProperty. Pour appeler les méthodes associées à la propriété, vous utilisez les méthodes Invoke (pour le getter) et InvokeSet (pour le créateur).

J'ai fait un test rapide avec le code de l'OP et cela a fonctionné pour moi (je suis sous PowerShell 4.0, cependant, alors peut-être que ça a quelque chose à voir avec ça):

$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
fourpastmidnight

Une autre façon serait un script que j'ai écrit appelé Get-ScheduledTask.ps1, disponible dans cet article:

How-To: utiliser PowerShell pour créer un rapport sur les tâches planifiées

De cette façon, vous n'avez besoin que de ce script unique et vous n'avez pas besoin de télécharger ou d'installer quoi que ce soit d'autre.

Facture

1
Bill_Stewart

voici un rapide basé sur: https://blogs.technet.Microsoft.com/heyscriptingguy/2015/01/17/weekend-scripter-use-powershell-to-document-scheduled-tasks/

Utilise Powershell: Get-ScheduledTask et 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