Windows 7 在网络服务帐户下发布到WMI时出现权限问题

Windows 7 在网络服务帐户下发布到WMI时出现权限问题,windows-7,permissions,wmi,uac,Windows 7,Permissions,Wmi,Uac,我正在将WMI发布添加到基于.net framework 3.5的windows服务中,该服务在“网络服务”帐户下运行 根据,默认情况下,“网络服务”帐户应具有WMI发布权限。(“默认情况下,允许以下用户和组发布数据和事件:…网络服务,…”) 但是,当服务调用Instrumentation.Publish(myStatusClassInstance)时,它抛出DirectoryNotFoundException System.IO.DirectoryNotFoundException was u

我正在将WMI发布添加到基于.net framework 3.5的windows服务中,该服务在“网络服务”帐户下运行

根据,默认情况下,“网络服务”帐户应具有WMI发布权限。(“默认情况下,允许以下用户和组发布数据和事件:…网络服务,…”)

但是,当服务调用Instrumentation.Publish(myStatusClassInstance)时,它抛出DirectoryNotFoundException

System.IO.DirectoryNotFoundException was unhandled
Message: Could not find a part of the path 'C:\Windows\system32\WBEM\Framework\root\MyWMINamespace\MyService_SN__Version_1.0.3686.26280.cs'.
…所以它看起来像System.Management.Instrumentation尝试动态生成代码,当在网络服务下运行时,它指向网络服务没有权限的目录

这方面的最佳修复/解决方法是什么?我可以在app.config或code中重写代码gen target dir吗?我不想在部署该服务时摆弄文件系统权限

更新:我认为这是一个“功能”,旧的FX代码与Win7中新的安全设置冲突。WMI托管类在内部从注册表检索WMI安装目录,并将其用作生成代码的输出路径。不幸的是,许多用户不允许(或不应该)在%SystemRoot%下写东西。。。我提交了一个connect bug(),看看MSFT是否能带来任何清晰性和/或提供修复或解决方法

更新2:我猜对于普通用户帐户,这不是问题,因为UAC虚拟化将启动并将文件存储到其他地方。然而,“网络服务”帐户显然不在UAC虚拟化的范围之内

更新3:增加了550pt赏金。简单限制:。基于net framework 3.5的windows服务作为网络服务运行,需要能够在Win7和Win2008[RTM&R2]上使用System.Management.Instrumentation通过WMI发布数据,并使用默认权限/安全设置,而无需使用反射修改框架内部/私有成员。”欢迎使用现成但干净的解决方案。如果允许,将打开第二个相关的赏金-Q作为另一个550pt的占位符

赏金更新:我打算通过一个作为赏金占位符的二手问题将此Q的赏金翻倍:

(我认为问题不在于发布数据,而在于首次在WMI中注册该类型

如果检查
System.Management.Instrumentation
code-in或其他反汇编程序,您将看到即将发布的程序集尚未注册,那么代码将尝试注册程序集并将程序集信息保存在WBEM安装文件夹下的一个特别命名的子目录中


我怀疑,如果您首先以管理员身份运行代码来发布WMI数据,它将注册程序集,然后网络服务帐户将具有执行正常发布的权限。

您是否已使用检查程序集?这将为您提供安装问题的日志。(但由于您无法将其作为网络服务帐户运行,因此它可能不会显示您遇到的问题。)

另外,您确定此服务必须在网络服务帐户下运行吗

由于在特权帐户中运行Windows服务存在漏洞风险,Microsoft使这些特殊服务帐户具有一些限制,这些限制在Vista和Win7中得到了加强。自Vista以来,Microsoft限制了在此帐户下运行的服务的数量,以支持特权较低的服务(请参阅)。网络服务帐户(又名“NT AUTHORITY\Network Service”)可以访问网络(作为本地计算机帐户PCNAME$),但它在本地计算机上的权限减少(与本地系统帐户不同)

您是否已检查程序集正在使用的分支的WMI安全权限?请运行并深入查看…当我快速检查一些随机分支时,我可以看到网络服务帐户没有写入权限


最后,我建议使用,这将允许您筛选到该进程,并查看文件或注册表设置中是否存在任何拒绝访问的错误。多年来,此工具为我解决了许多问题。

不确定是您提出的还是其他人提出的,但请查看:


这可能有助于您更好地理解问题的根本原因

您确定故障是由访问权限造成的吗?我建议使用系统内部工具。这一点很好。我是基于网络服务做出这一假设的,大多数其他用户不再被允许在%systemroot%下写入/创建……我将检查是否可以找到任何证据异常可能会掩盖另一个错误…是的,我是那个提交连接错误的人。我在问题中也包含了一个指向它的链接…它报告自己已注册(installutil还是这么说的)。此外,调用Instrumentation.IsAssemblyRegistered返回true,因此至少它认为它已注册。当我调用Instrumentation.Publish.IsAssemblyRegistered时会引发异常,但RegisterAssembly会引发与Publish相同的异常。因此,是的,您正在处理一些问题…:)感谢您的回复。Installutil仅报告成功。Procmon报告与问题中的异常相同;CreateFile在未找到的路径上失败…我将查看wmi权限…网络服务在我要写入的wmi命名空间中没有完全写入权限,因此我授予了它这些权限。但不幸的是,没有这样做解决这个问题。
System.Exception: The code generated for the instrumented assembly failed to compile.
   at System.Management.Instrumentation.InstrumentedAssembly..ctor(Assembly assembly, SchemaNaming naming)
   at System.Management.Instrumentation.Instrumentation.Initialize(Assembly assembly)
   at System.Management.Instrumentation.Instrumentation.GetInstrumentedAssembly(Assembly assembly)
   at System.Management.Instrumentation.Instrumentation.GetPublishFunction(Type type)
   at System.Management.Instrumentation.Instrumentation.Publish(Object instanceData)
   at SomeService.InstanceClass.PublishApp(String name) in e:\work\clientname\SomeService\SomeService\WMIProvider.cs:line 44
   at SomeService.SomeServiceService..ctor() in e:\work\clientname\SomeService\SomeService\SomeServiceService.cs:line 26
   at SomeService.Program.Main() in e:\work\clientname\SomeService\SomeService\Program.cs:line 17