我是一名程序员,但是遇到的问题已经超越了代码,进入了系统pipe理员领域,至less这是我现在所想的。 我将只使用一段代码来显示遇到问题的具体位置,并且还将提供命令行来替代代码实质上正在执行的内容,以便有人希望重新创build问题。 我不是系统pipe理员,但是因为我被告知不能没有一些解决方法,我已经采取了自己find解决scheme,所以我可以移动其他任务,而不必重写代码或search一个程序化解决scheme。 我曾经想过C用户和权限模拟,但是我希望尽可能避免这种情况。
困扰的程序是一个自定义的C锐利的应用程序customApp.exe,作为Server 2003上的计划任务运行。问题是我有一个C锐利的应用程序,在运行时及早检查其依赖项。 其中一个依赖项作为服务运行。 我执行一个查询来validation服务正在运行。 检查服务运行状态的行为会导致错误。 在服务器事件日志中,将失败作为失败审核logging在安全性下,并将权限作为失败原因。
存在用于运行customApp.exe程序的专用服务帐户。 权利是相当有限的,但足够的应用程序,如在testing运行中看到的。 应用程序作为计划任务运行时遇到问题。
计划任务失败的设置是不可见的,但我已经在debugging器中放置了一些检查来validation正确的设置。 基本上我把一个whoami报告的代码行来validation用户名和域是正确的。 我也知道用户名,域名和密码必须是正确的,因为应用程序与Microsoft SQL数据库的连接是正确的,在连接string中使用Integrated Security进行select和插入。 我的权限设置是未知的,但我知道系统pipe理员将专用服务帐户添加到特定计划任务下的安全选项卡。
这是导致大惊小怪的C#代码片段:
ServiceController sc = new ServiceController("Service Name Here"); if (sc.Status != ServiceControllerStatus.Running) {
这是一个与代码基本相同的命令提示符替代方法:
sc query "Service Name Here"
在专用服务帐户下运行login到服务器的customApp.exe会导致成功。 运行上面的命令提示符“sc query”“Service Name Here”在login时也会导致成功运行customApp.exe作为计划任务,在指定时间启动,无需干预,而在远程login到专用服务器服务帐户成功。
在任何其他条件下将customApp.exe作为计划任务运行将导致失败。 这可能是最让我困惑的部分。 如前所述,当我使用专用用户帐户远程login时,它会成功执行预定任务,否则将失败。
值得注意的是,我并没有试图启动或停止一个Windows服务。 我发现,需要pipe理员权限,我不想利用这种权力。 我坚信以最简单的方式运行应用程序,完成工作。
您将需要将任务计划程序configuration为以特定用户身份运行。 从任务计划程序中单击操作下拉菜单,然后select“AT服务帐户configuration”。 将其从系统帐户更改为“另一个用户帐户”,然后将其更改为您希望命令运行的帐户。
您可能需要指定一个不需要更改密码的帐户,以便您不必每次都重新configuration任务计划程序。