Windows 10调用WMI Win32_Share创建共享报Access Denied问题求助
Windows 10下使用WMI创建UNC共享返回Access Denied(错误码2)的解决方案
问题背景
我有一段在Windows 7环境下运行正常的UNC共享创建代码,用于Asp.Net MVC 5 Web应用中。但迁移到Windows 10开发机器后,代码执行失败,返回值为2(对应枚举CreateUncShareResult.AccessDenied)。
运行代码的用户拥有本地管理员权限,自动化测试中模拟本地管理员用户调用时也出现相同问题。
代码实现
public static CreateUncShareResult Create(string path, string shareName, string description, AccessControlList permissions) { ManagementClass managementClass = new ManagementClass(WIN32_Share); const string METHOD_NAME = "Create"; ManagementBaseObject inParams = managementClass.GetMethodParameters(METHOD_NAME); inParams["Description"] = description; inParams["Name"] = shareName; inParams["Path"] = path; inParams["Type"] = 0x0; // Disk Drive inParams["Access"] = permissions; ManagementBaseObject outParams = managementClass.InvokeMethod(METHOD_NAME, inParams, null); return (CreateUncShareResult)(outParams.Properties["ReturnValue"].Value); } public enum CreateUncShareResult: uint { Success = 0, [Description("Access Denied")] AccessDenied = 2, [Description("Unknown failure")] UnknownFailure = 8, [Description("Invalid Name")] InvalidName = 9, [Description("Invalid Level")] InvalidLevel = 10, [Description("Invalid Parameter")] InvalidParameter = 21, [Description("Duplicate Share")] DuplicateShare = 22, [Description("Redirected Path")] RedirectedPath = 23, [Description("Unknown Device or Directory")] UnknownDeviceOrDirectory = 24, [Description("Net Name Not Found")] NetNameNotFound = 25, }
问题分析与解决方法
没错,Windows 10和Windows 7在WMI共享创建的权限控制上确实存在明显差异,哪怕是管理员用户也会遇到权限限制,下面是具体原因和解决步骤:
1. 核心差异:UAC权限隔离与WMI权限收紧
Windows 10的UAC机制比Windows 7更严格,管理员用户默认以标准用户权限运行程序,只有显式提升权限后才能获取完整的管理员权限。另外,Windows 10对root\CIMV2(WIN32_Share所属的WMI命名空间)的默认权限做了收紧,管理员可能没有足够的执行权限来调用Create方法。
2. 具体解决方案
方法一:调整应用池与测试进程的权限
- Asp.Net MVC应用场景:
如果你用IIS托管应用,把应用池的身份设置为LocalSystem(本地系统账户,拥有最高系统权限),或者将当前管理员账户加入WMI Performance Users和Administrators组,同时确保应用池的Load User Profile选项已启用。 - 自动化测试场景:
确保测试进程以管理员身份运行——右键测试工具选择“以管理员身份运行”,或者在测试项目的属性中设置“Require Administrator”权限要求。
方法二:修改WMI命名空间权限
- 按下
Win+R输入wmimgmt.msc打开WMI管理控制台。 - 右键点击“WMI控制(本地)”,选择“属性”。
- 切换到“安全”选项卡,展开
root->CIMV2,点击“安全”按钮。 - 添加你的应用运行账户(或管理员组),授予执行方法、提供程序写入和启用账户这三项权限。
- 重启WMI服务(
winmgmt)使设置生效。
方法三:临时降低UAC级别(仅开发环境排查用)
如果只是在开发环境排查问题,可以临时调整UAC设置:
- 打开“控制面板” -> “用户账户” -> “更改用户账户控制设置”。
- 将滑块拉到“从不通知”,重启机器后测试。注意:这会降低系统安全性,不建议在生产环境使用。
额外排查点
- 先确认要共享的目录本身权限正确:给目标用户(或管理员组)授予读取/写入权限,不然即使共享创建成功,后续访问也会出问题。
- 可以先尝试注释掉
inParams["Access"] = permissions;这行代码(使用默认共享权限),排查是否是ACL参数格式不符合Windows 10的要求导致的问题。
内容的提问来源于stack exchange,提问作者Marc Chu
相关产品推荐
相关产品推荐

