Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell IRegisteredTask::RunEx不工作,并且存在';没有日志吗?_Powershell_Scheduled Tasks - Fatal编程技术网

Powershell IRegisteredTask::RunEx不工作,并且存在';没有日志吗?

Powershell IRegisteredTask::RunEx不工作,并且存在';没有日志吗?,powershell,scheduled-tasks,Powershell,Scheduled Tasks,如前所述,我正在尝试使用不同的用户执行计划任务 我以提升模式(Windows 10-1809)打开powershell,并执行以下命令: $a = New-ScheduledTaskAction -Execute notepad.exe Register-ScheduledTask -TaskName 'TestTask' -Action $a $svc = New-Object -ComObject 'Schedule.Service' $svc.Connect() $user = 'NT

如前所述,我正在尝试使用不同的用户执行计划任务

我以提升模式(Windows 10-1809)打开powershell,并执行以下命令:

$a = New-ScheduledTaskAction -Execute notepad.exe
Register-ScheduledTask -TaskName 'TestTask' -Action $a

$svc = New-Object -ComObject 'Schedule.Service'
$svc.Connect()

$user = 'NT SERVICE\TrustedInstaller'
$folder = $svc.GetFolder('\')
$task = $folder.GetTask('TestTask')
$task.RunEx($null, 0, 0, $user)
输出是这样的

没有错误,也没有在后台创建notepad.exe

这里怎么了?

  • 您的代码确实可以工作,但需要Windows 10版本1903(在早期版本中不工作可能是一个bug):

    • 似乎问题是特定于
      NT服务\TrustedInstaller
      用户帐户的;这份报告没有提出任何建议

      • 相比之下,以本地系统帐户
        NT AUTHORITY\SYSTEM
        的身份运行也可以在旧版本上正常工作,包括在Windows 7上
    • 请注意,即使代码正常工作,记事本实例也会以不可见的方式启动,因为它运行在隐藏会话(会话ID为
      0
      )中,服务和计划任务(默认情况下)在该会话中运行;要查找此会话中运行的所有进程,可以使用
      Get Process |?会话ID-等式0
      ;您还可以在任务管理器中找到此类隐藏进程


测试代码(也应适用于Windows 7),可用于测试不同的目标程序和用户帐户:

注:

  • 代码必须从提升的(“以管理员身份运行”)会话运行
  • 在我的实验中,我无法在当前用户的会话中使用本地系统帐户启动任务
$ok=$false
试一试{
#创建启动$targetExe以进行测试的计划任务。
$taskName=“\uuu TestTask”
$targetExe='notepad.exe'
$HaveCmdlet=[bool](Get命令-ErrorAction SilentlyContinue New ScheduledTaskAction)
#如果创建任务失败,我们将在下面尝试检索任务时捕获它。
if($havecmdlet){
$action=新的ScheduledTaskAction-执行$targetExe
$null=注册ScheduledTask-Force-TaskName$TaskName-Action$Action
}
else{#在Windows 10之前:使用schtasks.exe
schtasks.exe/create/tn$taskName/sc once/st 00:00/tr$targetExe/f*>$null
}
$ErrorActionPreference='Stop'
#通过COM自动化连接到任务计划程序。
$svc=新对象-ComObject“Schedule.Service”
$svc.Connect()
#获取要运行的任务。
$folder=$svc.GetFolder(“\”)\#
$task=$folder.GetTask($taskName)
#指定任务应在其中运行的用户帐户:
#仅W10 v1903及以上版本:
$user='NT服务\TrustedInstaller'
#注意:“NT AUTHORITY\SYSTEM”也应适用于较旧的系统。
#运行任务,该任务将输出表示正在运行的任务实例的对象。
#注意:如果任务*本身*可以启动,但$targetExe无法启动,则不会发生错误。
$taskInstance=$task.RunEx(
$null,#要传递的参数(变量类型)
0,#0==TASK_RUN_NO_标志;使用1==TASK_RUN_AS_SELF覆盖配置的用户并作为当前用户运行。
0,#0==默认会话ID;即使与4==任务#运行#使用#会话ID组合使用,针对不同会话似乎也不起作用。
$user#用户名(对配置了任务的用户使用$null)
)
#显示新创建的任务实例的属性。
写入主机”--已启动的任务:
$taskInstance |格式表*
#给$targetExe一些时间启动。
开始睡眠2
#列出所有$targetExe进程以及启动它们的用户帐户。
#将输出限制为在隐藏的“服务”会话(会话ID 0)中运行的进程
#使用:
#获取进程$targetExe |其中对象SessionId-eq 0
写入主机“-$targetExe进程:”
获取进程([IO.Path]::GetFileName WithOutExtension($targetExe))-IncludeUserName|
格式表Id、名称、用户名、会话Id
$ok=$true
}最后{
#清理一下。
$svc=$null
if($havecmdlet){
取消注册ScheduledTask-ErrorAction SilentlyContinue$taskName-Confirm:$false
}
否则{
$null=schtasks/delete/tn$taskName/f
}
如果($ok){
写入警告“启动的$targetExe进程本身不退出将继续运行。如果安全,请使用以下命令杀死所有现有实例:`n Stop process-Force-ErrorAction SilentlyContinue-Name$([IO.Path]::GetFileNameWithoutExtension($targetExe))”
}
}
上述情况应产生如下结果:

--已启动的任务:
名称实例GUID路径状态CurrentAction EngineId
----       ------------                           ----        ----- ------------- ---------
__TestTask{E61112AC9-7616-46A1-9514-6344EC445485}\\ uu TestTask 4 notepad.exe 4372
--notepad.exe进程:
Id名称用户名会话Id
-- ----    --------            ---------
4372记事本NT授权\系统0

请注意,即使是
NT AUTHORITY\SYSTEM
-而不是请求的
NT SERVICE\TrustedInstaller
帐户-这是有效的用户名,只有当作为
NT SERVICE\TrustedInstaller
启动时,该进程才具有充当受信任安装程序所需的安全令牌。

如果希望记事本在会话1中以系统用户的身份运行,以便在桌面上可见,则可以从提升的提示符运行带有sysinternals psexec的记事本:

psexec -si notepad

我可能在可见性问题上制造了一个麻烦,因为这个问题表明了对流程运行不可见的认识,所以这甚至可能不是一个要求。除此之外,(a)系统帐户(
NT AUTHORITY\system
)没有与
NT SERVICE\TrustedInstaller
帐户相同的权限,而且,据我所知,您不能将后者与
psexec
一起使用;(b) ,问题是关于启动时间表