我正在尝试对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文件中,该文件执行以下操作:
\fileserverhkpsexec.exe -accepteula -u admin -p "pwd" powershell.exe cpi \fileserverhkscriptsTaskSchedulerMonitor.ps1 -Destination C:MonitorTaskSchedulerMonitor.ps1
\fileserverhkpsexec.exe -accepteula -u admin -p "pwd" powershell.exe -ExecutionPolicy Bypass -File C:MonitorTaskSchedulerMonitor.ps1
第一步在本地复制.ps1文件,以使powershell不信任UNC路径,而第二部分则运行脚本。
如果我从测试服务器手动运行.bat文件,则执行正常(在管理员帐户下登录)。但是,当我通过geneos(在系统帐户下运行)发射.bat文件时,我会得到:
Access is denied.
PsExec could not start powershell.exe:
基本上我的问题是,在系统帐户下运行时,如何使PSEXEC切换用户?即使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,并且在管理下运行的PowerShell,所以它几乎是那里的,但是那里并不完全正确。
我们设法使用Windows schtasks 命令(链接在此处)上使用PowerShell包装器到达那里。可以在系统帐户下运行schtasks,并将返回所有必要的任务信息,因此我们不再需要使用权限,而在环境上不再使用清晰的文本密码(奖励)。
我们包装了:
schtasks.exe Query /FO CSV
在PowerShell脚本中,并使用PS将输出格式化为Geneos期望的CSV样式。