如何设置任务或线程权限?
Posted
技术标签:
【中文标题】如何设置任务或线程权限?【英文标题】:How do I set Task or Thread privileges? 【发布时间】:2013-08-04 08:21:08 【问题描述】:如何设置Task
或Thread
权限?
我问是因为我使用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
中搜索密钥但没有找到它。使用 完整 键名更新您的问题以获得更多帮助。
【讨论】:
以上是关于如何设置任务或线程权限?的主要内容,如果未能解决你的问题,请参考以下文章