我有以下代码,它使用 David Hall 的 TaskScheduler Nuget 包的 2.5.20 版,它包装了 Windows 任务计划程序。我正在尝试从特定文件夹中获取所有任务,但对于这个问题,我们只看这段代码:
using (TaskService ts = new TaskService(_ServerName, _TaskSchedulerUsername, _DomainName, _TaskSchedulerPassword)) {
var folder = ts.GetFolder(TASK_FOLDER_NAME);
}
_TaskSchedulerUsername
和_TaskSchedulerPassword
是具有管理员权限的有效本地帐户;我使用这些凭据打开 Windows 任务计划程序并手动创建一个任务,作为测试,并且能够毫无问题地执行此操作。
_ServerName
和 _DomainName
是一样的,本地机器。
此代码过去按原样工作,目前在我的测试服务器(运行 Windows Server 2003)上运行没有问题;它还在生产 Windows 2012 Server 机器上运行。在我的开发箱(运行 Windows 10)上,当我尝试实例化新的 TaskService 实例时收到 UnauthorizedAccessException
:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
堆栈跟踪不是很有用:
at Microsoft.Win32.TaskScheduler.V2Interop.TaskSchedulerClass.Connect(Object serverName, Object user, Object domain, Object password)
at Microsoft.Win32.TaskScheduler.TaskService.Connect()
at Microsoft.Win32.TaskScheduler.TaskService.EndInit()
at Microsoft.Win32.TaskScheduler.TaskService..ctor(String targetServer, String userName, String accountDomain, String password, Boolean forceV1)
at Test.TaskSchedulerServices.GetTaskSchedules() in C:\Projects\LE\dev\Test\Shared\Services\TaskSchedulerServices.svc.cs:line 54
关于为什么这不能在我的开发箱上运行以及如何处理它有什么想法吗?
最佳答案
Windows Vista 中的 Task Scheduler API 发生了重大变化。您的 Server 2003 计算机位于 v1 , 而新的 Windows 10 机器在 v2 上.在 v2 的情况下,有问题的 NuGet 包最终调用 ITaskScheduler::Connect
.该文档指定您只需将服务器名称保留为空即可连接到本地计算机。 (这应该也适用于 v1 的 SetTargetComputer
。)如果您要指定本地用户名,域应该设置为计算机名。
虽然如果你只是想以当前用户的身份连接到本地机器,你可以只使用不带参数的 TaskService
构造函数。
关于c# - UnauthorizedException 尝试使用 Windows TaskScheduler 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37708850/