Get-Child Item无法通过任务计划程序

时间:2018-05-17 13:01:41

标签: powershell

我正在尝试通过GPO部署的计划任务运行此脚本:

$registryPath = 'HKLM:\Software\CC\PST_Discovery_Script\Already_Run'

if  (!(Test-Path -Path $registryPath)) {

            $dir = "c:\Users"
            $ext = "pst" 
            Get-ChildItem "$dir" *$ext -r | Select-Object FullName,LastAccessTime,LastWriteTime,CreationTime,@{N='Owner';E={$_.GetAccessControl().Owner}}, @{Name="MegaBytes"; Expression={"{0:F2}" -f ($_.Length / 1MB)}}, @{N='Hostname';E={$env:computername}} | export-csv "c:\PST_Discovery.csv" -Append -NoTypeInformation 

   New-Item -Path HKLM:\Software\CC\PST_Discovery_Script -Name Already_Run –Force

}

Scheduled task

如果我通过Powershell控制台/ ISE手动运行脚本,而不是通过计划任务,它可以正常工作。

如果我通过计划任务运行它,我知道脚本正在运行,因为它读取了注册表项,如果它不存在则会写入一个注册表项,但它实际上并没有运行get-childitem行或导出CSV。

计划任务显示在客户端上,并且正在使用域管理员凭据(我)

运行 编辑:对不起,我的代码格式错误,我认为现在应该修复

kaspermoerch :是的,它是域管理员,因此拥有对文件系统的完全权限

boxdog :我实际上已将其写入UNC共享,但将其更改为本地计算机,因为它无效。我将尝试输出位置和用户的其他组合。

TheIncorrigible :最初是系统,但它无法正常工作,因此我编辑了推出的计划任务,并使用了我的域管理员帐户。

亚当: - 是,已创建计划任务
- 是,任务使用以下代码运行脚本:Powershell.exe -ExecutionPolicy Bypass \ server1 \ share1 \ PST_Discovery_Script.ps1
- 是的,它使用我的DA信用卡运行 - 是的,虽然它仍然写入了注册表值

,但是没有创建该文件

我已查看预定任​​务,请参阅我的屏幕截图。我正在提升任务调度程序并手动运行任务。

2 个答案:

答案 0 :(得分:0)

只是为了确保我理解正确。

  • 已创建计划任务。
  • 计划任务运行包含以下代码的脚本。
  • 计划任务使用您的凭据执行脚本。
  • 您的帐户位于Domain Admin组中。
  • “不工作”,不会创建PST_Discovery.csv文件。

如果我误解了任何事情,请纠正我。

首先:我将验证计划任务是否在提升的上下文中运行(runas管理员)。即使执行任务的帐户是管理员,该作业也需要在提升的上下文中运行。

enter image description here

第二:我很好奇这对你有用,但不是我。我从来没有见过像Select-Object这样的电话。如果我试图管道gci | Select-Object -Property @(...what you have...) | Export-Csv...,我会抱怨FullName

$registryPath = 'HKLM:\Software\CC\PST_Discovery_Script\Already_Run'

if (!(Test-Path -Path $registryPath)) {
    $dir = 'c:\Users'
    $ext = 'pst'
    Get-ChildItem -Path $dir -Filter *$ext -Recurse |
        Select-Object -Property @(
            FullName
            LastAccessTime
            LastWriteTime
            CreationTime
            @{N = 'Owner'; E = {$_.GetAccessControl().Owner}}
            @{Name = "MegaBytes"; Expression = {"{0:F2}" -f ($_.Length / 1MB)}}
            @{N = 'Hostname'; E = {$env:computername}}
        ) |
        Export-Csv -Path c:\PST_Discovery.csv -Append -NoTypeInformation
    New-Item -Path HKLM:\Software\CC\PST_Discovery_Script -Name Already_Run –Force
}

你100%肯定有效吗?我不得不将该片段更改为以下内容:

Select-Object -Property @(
, 'FullName'
, 'LastAccessTime'
, 'LastWriteTime'
, 'CreationTime'
@{N = 'Owner'; E = {$_.GetAccessControl().Owner}}
@{Name = "MegaBytes"; Expression = {"{0:F2}" -f ($_.Length / 1MB)}}
@{N = 'Hostname'; E = {$env:computername}}

我在Windows 10上运行Powershell 5.我正在从CLI执行您的示例。

答案 1 :(得分:0)

我复制了你布置的代码格式,它对我来说很好。

捕获任何错误的快速简便方法是将错误操作首选项更改为在脚本开始时停止,以便进程在第一个错误时退出,并且任何错误都将返回到计划任务的Last Run结果。从那里你应该能够看到异常。

$ErrorActionPreference = 'Stop'

如果你还没有解决它,至少应该提供一个起点。如果返回0以外的任何内容,那么你知道使用try/catch和输出日志来构建一些错误处理,以帮助你找到它的底部。