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.
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
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.
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.
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
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