【问题标题】:Get-Child Item not working through task schedulerGet-Child Item 无法通过任务计划程序工作
【发布时间】:2018-05-17 13:01:40
【问题描述】:

我正在尝试通过 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

}

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

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

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

编辑:对不起,我的代码格式全错了,我认为现在应该修复它

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

boxdog:我实际上让它写入了一个 UNC 共享,但是因为它不工作而将它更改为本地计算机。我会尝试一些输出位置和用户的其他组合。

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

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

我已经检查了计划任务,请看我的截图。我正在提升任务调度程序并手动运行任务。

【问题讨论】:

  • 您是否检查过运行计划任务的帐户对文件系统具有所需的权限?
  • 很可能是权限问题。它是否适用于不同的用户、不同的目标文件夹、不同的 CSV 输出位置等?尝试缩小实际失败的范围,因为似乎有几个可能的地方。
  • $dir = "c:\Users"
  • 您为什么将它作为您的域帐户(IN A GPO)而不是系统运行? @Matt 在if 语句中定义。

标签: powershell


【解决方案1】:

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

  • 计划任务已创建。
  • 计划任务运行包含以下代码的脚本。
  • 计划任务使用您的凭据执行脚本。
  • 您的帐户在域管理员组中。
  • 如果“不工作”,则不会创建 PST_Discovery.csv 文件。

如果我误解了什么,请纠正我。

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

第二:我很好奇这对你有用,但对我没有用。我从来没有见过像你这样打电话给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% 有效吗?我不得不将该 sn-p 更改为以下内容:

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 执行您的示例。

【讨论】:

  • 我的代码格式搞砸了,现在应该可以了,
【解决方案2】:

我复制了你列出的代码格式,对我来说效果很好。

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

$ErrorActionPreference = 'Stop'

如果您还没有解决它,那至少应该提供一个起点。如果返回 0 以外的任何值,那么您知道使用 try/catch 构建一些错误处理,也许还有一个输出日志,以帮助您深入了解它。

【讨论】:

  • 你是在计划任务中运行的吗?你有什么选择?谢谢,我会试试你的建议。
  • 我使用您指定的相同选项将其作为计划任务运行。这告诉我还有其他事情发生,您需要通过构建日志记录功能来调试正在运行的实际脚本,以确保将任何异常消息写入某处供您检查。祝你好运!
猜你喜欢
  • 2021-01-21
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2015-08-08
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多