我正在运行由第三方创建的小型可执行文件,需要在Windows 2008服务器上定期运行。这个可执行文件有效地将信息从一个系统ETL到另一个系统,并且需要每小时左右运行一次。作为其处理的一部分,可执行文件启动一个小的Windows窗体类型UI。
我已经设置了一个调度文件的计划任务,只有在配置了运行任务的用户登录到计算机(本地或通过远程桌面)时,这才能正常工作。如果我将任务设置为以另一个用户身份运行,或者将任务设置为在未记录用户时运行,则会在计划任务上执行并执行错误。我尝试过以不同的用户身份运行,包括管理员用户和系统用户。是否有任何可能的解决方法(不更改我无权访问的第三方代码),这将允许在没有特定用户登录的情况下运行此代码。
答案 0 :(得分:4)
GUI应用程序需要一个桌面,您只能为登录用户获取其中一个。
答案 1 :(得分:4)
本文介绍如何创建不需要任何登录的任务:https://www.scriptjunkie.us/2013/01/running-code-from-a-non-elevated-account-at-any-time/
所述程序如下:
首先,创建一个计划任务,以默认选项作为当前用户运行您的命令(这将默认创建仅在您登录时运行的计划任务):
schtasks /create /tn mytask /SC HOURLY /TR "calc"
然后将任务导出为XML:
schtasks /query /XML /tn mytask > temp.xml
并删除任务:
schtasks /delete /tn mytask /f
然后打开xml文件,并替换该行
<LogonType>InteractiveToken</LogonType>
同<LogonType>S4U</LogonType>
假设PowerShell在系统上,可以使用以下命令完成此操作:
powershell -Command "Get-Content '.\temp.xml' | foreach {$_ -replace 'InteractiveToken', 'S4U' }" > new.xml move /y new.xml temp.xml
现在从修改后的XML文件中重新创建任务:
schtasks /create /xml temp.xml /tn mytasks
并删除您的临时文件:
del /f /q temp.xml
答案 2 :(得分:3)
我可能迟到了回复,但我们不能在命令中使用,没有/互动......
https://support.microsoft.com/en-us/kb/313565
根据microsoft:/ interactive:使用此参数允许任务与任务运行时登录的用户的桌面进行交互。
答案 3 :(得分:2)
我想我找到了解决这种情况的方法。您需要在服务器上有两个用户帐户(User1和User2)。 RMD进入User1下的服务器。在此RMD中,创建计划任务,并将其设置为在User2帐户下运行。然后,从这个RMD中,你需要使用User2凭证(在梦中有点像Inception&dream;梦)中的RMD进入服务器本身。重要的是不要将这个新的RMD窗口最小化;你可以把它缩小,但它必须是开放的。然后您可以自由关闭原始RMD会话,任务将在User2帐户下运行,因为User2在您的第二个RMD会话中有一个打开的桌面。
Protip - 不要取消固定RMD窗口顶部的RMD窗口句柄 - 然后关闭正确的RMD可能会很痛苦。如果您这样做,则需要使用“开始”&gt;从RMD中一直注销选项。
答案 4 :(得分:2)
有一个简单的解决方案。 将组更改为本地组&#34;用户&#34;并且不会提示您输入密码。 (计划任务 - 一般 - 安全选项 - 更改用户或组)。
答案 5 :(得分:1)
从我所做的研究(以及David Heffernan的回答)看来,在不影响源代码的情况下,这是不可能的。
How can I run a Windows GUI application on as a service?有一些与此相关的有用的想法,但没有一个为这个问题提供可行的解决方法。
答案 6 :(得分:0)
这似乎是一个旧线程,但是由于他们未使用的UAC要求,我最近在我的组织中遇到了这个问题。我仍在对此进行测试,但是我相信您仍然可以通过在任务上使用/Change
命令并添加/IT
标志使其具有交互性来对计划任务启用交互模式。在这里引用:https://docs.microsoft.com/en-us/windows/desktop/taskschd/schtasks
schtasks /Change /tn "Task A" /IT /RP "password of user if used"
我的初步测试表明这是可行的,但是当我这样做时,我看不到任务调度程序中的任务有什么不同。因此,我不确定如何验证它是否设置为执行此操作。