如何设置任务或线程权限?

Posted

技术标签:

【中文标题】如何设置任务或线程权限?【英文标题】:How do I set Task or Thread privileges? 【发布时间】:2013-08-04 08:21:08 【问题描述】:

如何设置TaskThread 权限?

我问是因为我使用Task Scheduler Managed Wrapper 和I call it in another thread (that apparently has lower privileges) I get exception。

我看到了this SO question,但没能成功使用(Thread.CurrentPrincipal.Identity as WindowsIdentity 为空)

编辑:

这就是我启动线程的方式:

await Task.Factory.StartNew(() => 
    /*...*/
, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

编辑 2:

这些是异常的详细信息:

COMException: Interface not registered (Exception from HRESULT: 0x80040155)

    at Microsoft.Win32.TaskScheduler.V2Interop.IRegisteredTask.get_Definition()
    at Microsoft.Win32.TaskScheduler.Task.get_Definition()
    at TCM.TaskShedulerStartUp.Update() in c:\...\TaskShedulerStartUp.cs:line 61

【问题讨论】:

所有线程都是以进程的权限启动的,所以很可能你的诊断是错误的。 如果您的诊断正确,请不要更改任务正在运行的线程。它是一种共享资源。创建一个您拥有的新线程。 @usr:查看“编辑”:我拥有我创建的线程(我错了吗???) @HenkHolterman:我看不出我哪里错了-当我从“主”线程执行此操作时,它可以工作-此外-如果我要求主线程执行此操作(使用@987654329 @),它也可以工作。 @Tal 虽然文档不能保证,但实际上是的。我还是更喜欢这里的自定义任务调度程序。 【参考方案1】:

此 COM 错误代码与线程权限无关,链接的文章对此非常错误。在HKLM\Software\Classes\Interface 注册表项中注册了一个接口。当 COM 需要将调用从一个线程编组到另一个线程时,它会查看那里,它需要知道哪个代理将复制函数参数值。这肯定是您的程序中很可能出现的情况,我们唯一知道的是您确实启动了一个线程。

您机器上的注册表似乎有问题。或者 COM 服务器根本没有正确注册。或者 COM 服务器只是不支持从线程中使用。或者您的程序是 64 位版本 Windows 上的 32 位进程,并且 Wow6432Node 中不存在界面密钥。或者服务器注册不正确,只在 HKCU 而不是 HKLM 中写入密钥,这确实与用于运行代码的用户帐户有关。

您的问题中没有任何内容可以帮助我们帮助您缩小范围。任务调度程序出现问题是一个长期的解释,丢失注册表项将是您机器的一个相当严重的问题。

通过运行 SysInternals 的 ProcMon 实用程序开始诊断此问题。您将看到您的程序在 Interface 中搜索密钥但没有找到它。使用 完整 键名更新您的问题以获得更多帮助。

【讨论】:

以上是关于如何设置任务或线程权限?的主要内容,如果未能解决你的问题,请参考以下文章

每个线程或每个任务的异常设置?

任务使用内部 Theadpool 或任务调度器,然后新线程如何在任务管理器中显示 [重复]

如何设置它以便线程通信它们已完成任务?

Windows权限维持——计划任务

java线程池如何合理的设置大小

java 一个线程池可以有多个工作对列吗?如何实现