UnauthorizedException尝试使用Windows TaskScheduler包装器

时间:2016-06-08 17:12:15

标签: c# winapi taskscheduler

我有以下代码,它使用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

关于为什么这会在我的开发箱上运行的任何想法,以及如何应对它?

1 个答案:

答案 0 :(得分:1)

任务计划程序API在Windows Vista中发生了显着变化。您的Server 2003计算机在v1上,而新的Windows 10计算机在v2上。对于v2,有问题的NuGet包最终会调用ITaskScheduler::Connect。该文档指定您只需将服务器名称保留为null即可连接到本地计算机。 (这应该适用于v1的SetTargetComputer。)如果您指定了本地用户的名字,域名应该设置为计算机的名称。

虽然如果您只想以当前用户身份连接到本地计算机,但您可以使用不带参数的TaskService构造函数。