我正在尝试对 Windows 任务计划程序进行一些监视,我有一个运行以下内容的 Powershell 脚本:
$serverName = hostname
$schedule = new-object -com("Schedule.Service")
$schedule.connect($serverName)
$tasks = $schedule.getfolder("\").gettasks(0)
$tasks |select name, lasttaskresult, lastruntime
这将返回运行它的服务器上的计划任务列表、最后一个任务结果和最后一次运行时间。这样做的目的是将数据集返回到我们的监控解决方案 (Geneos),我们可以将其用于警报。
我们有一个大的 Win2008 资产,所以我希望脚本集中,允许任何 Geneos 探测器调用它并为它们的主机返回一个数据集。为此,我将 powershell 包装在一个 .bat 文件中,该文件执行以下操作:
\\fileserverhk\psexec.exe -accepteula -u admin -p "pwd" powershell.exe cpi \\fileserverhk\scripts\TaskSchedulerMonitor.ps1 -Destination C:\Monitor\TaskSchedulerMonitor.ps1
\\fileserverhk\psexec.exe -accepteula -u admin -p "pwd" powershell.exe -ExecutionPolicy Bypass -File C:\Monitor\TaskSchedulerMonitor.ps1
第一步在本地复制 .ps1 文件以绕过 Powershell 不信任 UNC 路径,第二部分运行脚本。
如果我从测试服务器手动运行 .bat 文件,它可以正常执行(这是在管理员帐户下登录的)。但是,当我通过 Geneos(在 SYSTEM 帐户下运行)触发 .bat 文件时,我得到:
Access is denied.
PsExec could not start powershell.exe:
所以基本上我的问题是,如何让 PsExec 在 SYSTEM 帐户下运行时切换用户?尽管 PsExec 为另一个帐户设置了凭据,但显然有一些东西阻止它在系统下运行时发生更改。
我阅读并尝试使用-h开关运行它,但出现以下错误:
The handle is invalid.
Connecting to local system...
Starting PsExec service on local system...
Connecting with PsExec service on <server>...
Starting powershell.exe on <server>...
Error communicating with PsExec service on <server>:
除了上述错误之外,我最终将 PSExec 和 powershell 进程挂在了远程计算机上。有趣的部分是我可以看到 PSExec 和 PSEXEC.SVC 在 SYSTEM 下运行,而 powershell 在 admin 下运行,所以它几乎就在那里,但有些东西并不完全正确。