C# 等待/异步导致;“拒绝访问”;在远程WMI中
我在Win Server 2008 R2计算机上通过WMI检索服务列表,我有管理权限(并使用特定的管理员帐户访问)。我认为安全性还可以,因为我可以在.net和wbemtest中提取数据 当我使用完全相同的代码并使用wait和async访问数据时,问题就出现了。在这一点上,当我使用foreach遍历返回的对象时,我得到了一个“拒绝访问”的消息 我想强调的是,它返回的ManagementObjectCollection很好。如果我不使用wait,它也可以正常工作。工作和不工作之间的唯一区别是方法上的async关键字和添加的wait代码,如下所示:C# 等待/异步导致;“拒绝访问”;在远程WMI中,c#,.net,asynchronous,wmi,C#,.net,Asynchronous,Wmi,我在Win Server 2008 R2计算机上通过WMI检索服务列表,我有管理权限(并使用特定的管理员帐户访问)。我认为安全性还可以,因为我可以在.net和wbemtest中提取数据 当我使用完全相同的代码并使用wait和async访问数据时,问题就出现了。在这一点上,当我使用foreach遍历返回的对象时,我得到了一个“拒绝访问”的消息 我想强调的是,它返回的ManagementObjectCollection很好。如果我不使用wait,它也可以正常工作。工作和不工作之间的唯一区别是方法上的
ManagementObjectCollection queryCollection = await Task.Run(() => Operations.ConnectService(wmipath, username, password));
ConnectService是一个静态方法,实际上可以很好地获取集合。我遇到的问题是:当我从阻塞变为线程时,为什么会出现“访问被拒绝”的情况?我遗漏了什么?代码片段与上下文无关,因此很难判断发生了什么。但是,我怀疑这与线程上的当前标识有关。请尝试在执行查询“Operations.ConnectService(…)”的代码中的System.Security.Principal.WindowsIdentity.GetCurrent()调试器和在“await”之后运行的代码中查找差异。谢谢,我将开始朝这个方向探索。如果您发现您的代码在不同的用户下运行,您可能需要这样做:
var ctx=System.Security.SecurityContext.Capture();System.Security.SecurityContext.Run(ctx,()=>{…},null)代码>