题 用户需要哪些权限/权限才能在远程计算机上进行WMI访问?


我正在编写一个使用WMI从远程计算机获取信息的监控服务。由于政治原因,不可能在所有这些机器上拥有本地管理员权限。

这可能吗?我的用户需要哪些权限/权限?


32
2018-06-19 07:17






答案:


以下适用于Window 2003 R2 SP 2,Windows Server 2012 R2

  1. 将相关用户添加到 性能监视器用户 组
  2. 在“服务和应用程序”下,打开WMI Control的属性对话框(或运行 wmimgmt.msc)。在“安全”选项卡中,突出显示 Root/CIMV2,单击安全性;加 性能监视器用户 并启用选项: Enable Account 和 Remote Enable
  3. dcomcnfg。在“组件服务”>“计算机”>“我的电脑”的“属性”对话框的“COM安全”选项卡中,单击“编辑限制” Access Permissions 和 Launch and Activation Permissions。添加性能监视器用户并允许远程访问,远程启动和远程激活。
  4. 在组件服务>计算机>我的电脑> DCOM配置下选择Windows Management Instrumentation,然后选择 Remote Launch 和 Remote Activation 特权 性能监视器用户 组。

笔记:

  • 作为步骤3和4的替代,可以将用户分配给该组 分布式COM用户 (在Windows Server 2012 R2上测试过)
  • 如果用户需要访问所有命名空间,则可以在2.处设置设置 Root level,并通过。将递归权限递归到子命名空间 Advanced 窗口 Security

31
2017-07-24 07:42



我发现如果将用户添加到分布式COM用户,则不需要执行步骤2和3。 - Nexus
在WinXP和Win7上工作,我无法添加“分布式COM用户”组 - 也许这个组只能在服务器上访问?尝试添加权限时,在名称查找期间无法解析。此外,我发现我必须在“Root”和“Root / CIMV2”上设置WMI权限,并且我必须进入高级权限并应用子名称空间和命名空间的权限。 - Shannon Wagner
适用于Windows 8!另外,有人知道如何从powershell或其他shell中做同样的事情吗? - Bunyk
如果您希望用户能够访问所有命名空间,您可以授予权限 根 通过选择Root,打开所有子命名空间 安全 然后 高级 并设置递归。默认情况下,这些设置仅适用于所选对象和 不要 级联。 - Thomas
这对MSCluster命名空间不起作用 - John


我在Windows 8上所做的就是将用户添加到“远程管理用户”组,并且远程WQL请求有效。


4
2018-03-31 13:33





默认情况下,只有本地Administrators组具有WMI的远程权限。您必须自定义WMI“远程启用”权限。


1
2018-06-19 07:41





您可能还必须授予“DCOM远程访问权限”和/或“DCOM远程启动和激活权限”,具体取决于您要执行的操作。 这篇MSDN文章 给出了逐步的程序。


1
2018-06-19 11:23





以下在2012 r2域环境中为我工作,虽然我只设法在每个服务器而不是整个域中执行:

1)将用户添加到Performance Log Users Group。 2)运行wmimgmt.msc,右键单击“WMI控件(LOCAL),转到安全性选项卡,并在所需的命名空间(通常为CIMV2)上授予相应的用户”启用帐户“和”远程启用“。

如果我设法完成整个域的完成,我会回来更新。


0
2018-05-04 09:54





根据所选答案,我修改了Microsoft的脚本以设置WMI安全性。我的测试用户是非管理域用户,由于原因,他是本地系统上“远程管理用户”的成员 不相关的 这个问题。授予我的用户对目标命名空间的EnableAccount,RemoteEnable和ExecuteMethods权限后,我能够访问WMI。

所以我做了  将我的用户添加到 性能监视器用户 要么 分布式COM用户 当地团体。

关于脚本的一些注意事项:

  1. 您必须指定命名空间的完整路径。在我的例子中,命名空间是Root / Microsoft / SqlServer
  2. 继承是错误的。因为没有叶子对象你不能使用 $OBJECT_INHERIT_ACE_FLAG
  3. 我摆脱了嵌入式功能,因为它太小而且只使用了一次。

脚本如下。我把它命名为Set-WMINamespaceSsecurity.ps1

Param ([Parameter(Mandatory=$true,Position=0)] [string]$Namespace,
       [Parameter(Mandatory=$true,Position=1)] [ValidateSet("Add","Remove")] [string]$Operation,
       [Parameter(Mandatory=$true,Position=2)] [string] $Account,
       [Parameter(Mandatory=$false,Position=3)] [ValidateSet("EnableAccount","ExecuteMethods","FullWrite","PartialWrite","ProviderWrite","RemoteEnable","ReadSecurity","WriteSecurity")] [string[]] $Permissions=$null,
       [Parameter(Mandatory=$false)] [switch]$AllowInherit,
       [Parameter(Mandatory=$false)] [switch]$Deny,
       [Parameter(Mandatory=$false)] [string]$ComputerName=".",
       [Parameter(Mandatory=$false)] [System.Management.Automation.PSCredential]$Credential=$null)

$OBJECT_INHERIT_ACE_FLAG    = 0x1
$CONTAINER_INHERIT_ACE_FLAG = 0x2
$ACCESS_ALLOWED_ACE_TYPE    = 0x0
$ACCESS_DENIED_ACE_TYPE     = 0x1

$WBEM_ENABLE            = 0x01
$WBEM_METHOD_EXECUTE    = 0x02
$WBEM_FULL_WRITE_REP    = 0x04
$WBEM_PARTIAL_WRITE_REP = 0x08
$WBEM_WRITE_PROVIDER    = 0x10
$WBEM_REMOTE_ACCESS     = 0x20
$WBEM_RIGHT_SUBSCRIBE   = 0x40
$WBEM_RIGHT_PUBLISH     = 0x80
$READ_CONTROL           = 0x20000
$WRITE_DAC              = 0x40000
$WBEM_S_SUBJECT_TO_SDS  = 0x43003

$ErrorActionPreference = "Stop"

$InvokeParams=@{Namespace=$Namespace;Path="__systemsecurity=@";ComputerName=$ComputerName}
if ($PSBoundParameters.ContainsKey("Credential")) { $InvokeParams+= @{Credential=$Credential}}

$output = Invoke-WmiMethod @InvokeParams -Name "GetSecurityDescriptor"
if ($output.ReturnValue -ne 0) { throw "GetSecurityDescriptor failed:  $($output.ReturnValue)" }

$ACL = $output.Descriptor

if ($Account.Contains('\')) {
  $Domain=$Account.Split('\')[0]
  if (($Domain -eq ".") -or ($Domain -eq "BUILTIN")) { $Domain = $ComputerName }
  $AccountName=$Account.Split('\')[1]
}
elseif ($Account.Contains('@')) {
  $Somain=$Account.Split('@')[1].Split('.')[0]
  $AccountName=$Account.Split('@')[0]
}
else {
  $Domain = $ComputerName
  $AccountName = $Account
}

$GetParams = @{Class="Win32_Account" ;Filter="Domain='$Domain' and Name='$AccountName'"}
$Win32Account = Get-WmiObject @GetParams
if ($Win32Account -eq $null) { throw "Account was not found: $Account" }

# Add Operation
if ($Operation -eq "Add") {
  if ($Permissions -eq $null) { throw "Permissions must be specified for an add operation" }

  # Construct AccessMask
  $AccessMask=0
  $WBEM_RIGHTS_FLAGS=$WBEM_ENABLE,$WBEM_METHOD_EXECUTE,$WBEM_FULL_WRITE_REP,$WBEM_PARTIAL_WRITE_REP,$WBEM_WRITE_PROVIDER,$WBEM_REMOTE_ACCESS,$READ_CONTROL,$WRITE_DAC
  $WBEM_RIGHTS_STRINGS="EnableAccount","ExecuteMethods","FullWrite","PartialWrite","ProviderWrite","RemoteEnable","ReadSecurity","WriteSecurity"
  $PermissionTable=@{}
  for ($i=0; $i -lt $WBEM_RIGHTS_FLAGS.Count; $i++) { $PermissionTable.Add($WBEM_RIGHTS_STRINGS[$i].ToLower(), $WBEM_RIGHTS_FLAGS[$i]) }
  foreach ($Permission in $Permissions) { $AccessMask+=$PermissionTable[$Permission.ToLower()] }

  $ACE=(New-Object System.Management.ManagementClass("Win32_Ace")).CreateInstance()
  $ACE.AccessMask=$AccessMask
  # Do not use $OBJECT_INHERIT_ACE_FLAG.  There are no leaf objects here.
  if ($AllowInherit.IsPresent) { $ACE.AceFlags=$CONTAINER_INHERIT_ACE_FLAG }
  else { $ACE.AceFlags=0 }

  $Trustee=(New-Object System.Management.ManagementClass("Win32_Trustee")).CreateInstance()
  $Trustee.SidString = $Win32Account.SID
  $ACE.Trustee=$Trustee

  if ($Deny.IsPresent) { $ACE.AceType = $ACCESS_DENIED_ACE_TYPE } else { $ACE.AceType = $ACCESS_ALLOWED_ACE_TYPE }
  $ACL.DACL+=$ACE
}
#Remove Operation
else {
  if ($Permissions -ne $null) { Write-Warning "Permissions are ignored for a remove operation" }
  [System.Management.ManagementBaseObject[]]$newDACL = @()
  foreach ($ACE in $ACL.DACL) {
    if ($ACE.Trustee.SidString -ne $Win32Account.SID) { $newDACL+=$ACE }
  }
  $ACL.DACL = $newDACL
}

$SetParams=@{Name="SetSecurityDescriptor"; ArgumentList=$ACL}+$InvokeParams

$output = Invoke-WmiMethod @SetParams
if ($output.ReturnValue -ne 0) { throw "SetSecurityDescriptor failed: $($output.ReturnValue)" }

0
2017-08-14 18:57





我们为PRTG做了这个: 我们创建了一个新的域用户: 创建了一个GPO Dit,将其用户置于“Performnce Log Users”组中 并使用powershell脚本将此用户添加到WMI控件。 谢谢:

https://live.paloaltonetworks.com/t5/Management-Articles/PowerShell-Script-for-setting-WMI-Permissions-for-User-ID/ta-p/53646


-1
2018-05-19 12:32



请在答案中直接包含相关信息。发布的答案应该能够独立,只需使用链接作为参考。 - Cory Knutson