使用PowerShell无法设置DCOM配置权限完全控制的问题
解决DCOM配置权限无法设置完全控制的问题
你的问题出在AccessMask值不匹配:当前脚本里统一用$ace.AccessMask = 11,这个值仅对应「启动和本地激活」权限,完全不包含配置权限的「完全控制」权限。不同类型的DCOM权限需要对应不同的AccessMask掩码,得分别配置。
关键权限掩码对应
先明确三类DCOM权限的核心掩码值:
- 启动和激活权限:
11(对应启动+本地激活,原设置是对的) - 配置权限(完全控制):
268435456(十六进制0x10000000,对应配置权限的完全控制) - 访问权限(完全控制):
1(对应访问权限的完全控制)
修改后的脚本
因为三类权限需要不同的权限设置,要分别创建ACE对象,再添加到对应的安全描述符中:
# 替换为目标DCOM应用的AppID $appId = '{Enter App ID here}' $pcName = $env:COMPUTERNAME $userName = "TCPComUser" # 获取DCOM应用设置对象 $wmi = Get-WmiObject -Class Win32_DCOMApplicationSetting -Filter "AppId='$appId'" -EnableAllPrivileges # 获取三类权限的安全描述符 $launchDesc = $wmi.GetLaunchSecurityDescriptor().descriptor $configDesc = $wmi.GetConfigurationSecurityDescriptor().descriptor $accessDesc = $wmi.GetAccessSecurityDescriptor().descriptor # 创建用户信任对象 $trustee = ([wmiclass]'Win32_Trustee').psbase.CreateInstance() $trustee.Domain = $pcName $trustee.Name = $userName # --- 1. 配置启动和激活权限(启动+本地激活) --- $launchAce = ([wmiclass]'Win32_ACE').psbase.CreateInstance() $launchAce.AccessMask = 11 $launchAce.Trustee = $trustee $launchDesc.DACL += [System.Management.ManagementBaseObject]$launchAce # --- 2. 配置权限(完全控制) --- $configAce = ([wmiclass]'Win32_ACE').psbase.CreateInstance() $configAce.AccessMask = 268435456 $configAce.Trustee = $trustee $configDesc.DACL += [System.Management.ManagementBaseObject]$configAce # --- 3. 访问权限(完全控制) --- $accessAce = ([wmiclass]'Win32_ACE').psbase.CreateInstance() $accessAce.AccessMask = 1 $accessAce.Trustee = $trustee $accessDesc.DACL += [System.Management.ManagementBaseObject]$accessAce # 应用所有权限设置 $wmi.SetLaunchSecurityDescriptor($launchDesc) $wmi.SetConfigurationSecurityDescriptor($configDesc) $wmi.SetAccessSecurityDescriptor($accessDesc)
额外注意事项
- 必须以管理员身份运行PowerShell,否则无权限修改DCOM安全设置
- 确保
$appId替换为目标DCOM应用的真实AppID(可通过组件服务查看) - 如果需要避免重复添加同一用户的权限,可以在添加ACE前先检查DACL中是否已存在该用户的条目
内容的提问来源于stack exchange,提问作者Debugga
相关产品推荐
相关产品推荐

