我正在为一个基于.NET Framework 3.5的Windows服务添加WMI发布功能,该服务在“网络服务”帐户下运行。
根据我在MSDN上找到的文档,默认情况下,“网络服务”帐户应具有WMI发布权限。 (“默认情况下,以下用户和组被允许发布数据和事件:...网络服务,...”)
然而,当服务调用Instrumentation.Publish(myStatusClassInstance)时,它会抛出DirectoryNotFoundException异常;
看起来 System.Management.Instrumentation 试图动态生成代码,并且在以网络服务身份运行时,它会定位到一个网络服务没有权限的目录。
这个问题有什么最佳解决方法/变通之法?我能否在 app.config 或代码中覆盖代码生成目标目录?我不想在部署服务时去调整文件系统权限……
更新:我认为这是一个“特性”,旧版 FX 代码与 Win7 中较新的安全设置发生了冲突。WMI 管理类从注册表检索 WMI 安装目录,并将其用作生成代码的输出路径。不幸的是,很多用户不被允许(或不应该)在 %SystemRoot% 下写入东西……我提交了一个 connect bug(#530392),希望微软能提供任何明确的解释和/或提供修复或变通之法。
更新2:我猜对于普通用户账户来说,这不是问题,因为 UAC 虚拟化会启动并将文件存储在其他地方。然而,显然“网络服务”账户不受 UAC 虚拟化的保护……(?) 更新3: 增加了550pt的赏金。简单约束条件:基于.net framework 3.5的Windows服务,作为网络服务运行,在Win7和Win2008[RTM和R2]上需要能够通过System.Management.Instrumentation使用WMI发布数据,在默认权限/安全设置下且不使用反射修改框架内部/私有成员。欢迎使用“开箱即用”但干净的解决方案。如果SO允许,我将打开第二个相关赏金-Q作为另一个550pt的占位符。
根据我在MSDN上找到的文档,默认情况下,“网络服务”帐户应具有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 或代码中覆盖代码生成目标目录?我不想在部署服务时去调整文件系统权限……
更新:我认为这是一个“特性”,旧版 FX 代码与 Win7 中较新的安全设置发生了冲突。WMI 管理类从注册表检索 WMI 安装目录,并将其用作生成代码的输出路径。不幸的是,很多用户不被允许(或不应该)在 %SystemRoot% 下写入东西……我提交了一个 connect bug(#530392),希望微软能提供任何明确的解释和/或提供修复或变通之法。
更新2:我猜对于普通用户账户来说,这不是问题,因为 UAC 虚拟化会启动并将文件存储在其他地方。然而,显然“网络服务”账户不受 UAC 虚拟化的保护……(?) 更新3: 增加了550pt的赏金。简单约束条件:基于.net framework 3.5的Windows服务,作为网络服务运行,在Win7和Win2008[RTM和R2]上需要能够通过System.Management.Instrumentation使用WMI发布数据,在默认权限/安全设置下且不使用反射修改框架内部/私有成员。欢迎使用“开箱即用”但干净的解决方案。如果SO允许,我将打开第二个相关赏金-Q作为另一个550pt的占位符。
赏金更新: 我打算通过第二个与此问题配合的问题来将赏金加倍,并将其作为赏金占位符:
https://stackoverflow.com/questions/2208341/bounty-placeholder(<-- 显然这是不被允许的,所以赏金占位符问题被 SO 礼仪警察关闭了。)
因此,我尝试使用64位版本的installutil安装服务。但在%sysroot%\wbem\framework...等路径中出现权限错误,导致失败。接下来,我重新编译了x86的服务,并再次使用32位版本的installutil进行注册。结果出现了一个全新的异常:
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
越来越接近了...