사용자는 원격 컴퓨터에서 WMI 액세스 권한이 필요한 권한 / 권한은 무엇입니까?


33

WMI를 사용하여 원격 컴퓨터에서 정보를 얻는 모니터링 서비스를 작성 중입니다. 정치적 이유로 이러한 모든 컴퓨터에 대한 로컬 관리자 권한을 갖는 것은 불가능합니다.

이것이 가능한가? 사용자에게 필요한 권한 / 권한은 무엇입니까?

답변:


31

다음은 Windows 2003 R2 SP 2, Windows Server 2012 R2에서 작동합니다.

  1. 해당 사용자를 Performance Monitor Users 그룹에 추가
  2. 서비스 및 응용 프로그램에서 WMI 컨트롤의 속성 대화 상자를 불러옵니다 (또는 실행 wmimgmt.msc). 보안 탭에서을 강조 표시하고 보안을 Root/CIMV2클릭하십시오. 추가 성능 모니터 사용자를 하고 옵션을 활성화합니다 Enable AccountRemote Enable
  3. 를 실행하십시오 dcomcnfg. 구성 요소 서비스> 컴퓨터> 내 컴퓨터에서 속성 대화 상자의 COM 보안 탭에서 Access Permissions및에 대해 "제한 편집"을 클릭하십시오 Launch and Activation Permissions. 성능 모니터 사용자를 추가하고 원격 액세스, 원격 실행 및 원격 활성화를 허용하십시오.
  4. 구성 요소 서비스> 컴퓨터> 내 컴퓨터> DCOM 구성에서 Windows 관리 계측을 선택하여 제공 Remote Launch하고 Remote Activation특권 성능 모니터 사용자 그룹.

노트:

  • 3 단계와 4 단계의 대안으로 사용자를 Distributed COM Users 그룹에 할당 할 수 있습니다 (Windows Server 2012 R2에서 테스트).
  • 사용자가 모든 네임 스페이스에 액세스해야하는 경우 Root레벨 에서 2.의 설정을 설정하고 의 Advanced창을 통해 하위 네임 스페이스에 대한 권한을 되풀이 할 수 있습니다.Security

1
분산 COM 사용자에 사용자를 추가하는 경우 2 단계와 3 단계가 필요하지 않다는 것을 알았습니다.
Nexus

WinXP 및 Win7에서 "Distributed COM Users"그룹을 추가 할 수 없었습니다.이 그룹은 서버에서만 액세스 할 수 있습니까? 권한을 추가하려고 할 때 이름 조회 중에는 해결되지 않습니다. 또한 "Root / CIMV2"뿐만 아니라 "Root"에 대한 WMI에 대한 권한을 설정해야하고 네임 스페이스뿐만 아니라 하위 네임 스페이스에 대한 권한을 적용하고 고급 권한으로 이동해야한다는 것을 알았습니다.
Shannon Wagner

Windows 8에서도 작동합니다! 또한 누군가 powershell 또는 다른 쉘에서 동일한 작업을 수행하는 방법을 알고 있습니까?
Bunyk

1
사용자가 모든 네임 스페이스에 액세스 할 수있게하려면 루트 를 선택하고 루트를 선택한 다음 보안 을 열고 고급을 재귀를 설정 하여 루트 및 모든 하위 네임 스페이스에 권한을 부여 할 수 있습니다 . 기본적으로 이러한 설정은 선택한 객체에만 적용되며 계단식으로 연결 되지 않습니다 .
토마스

MSCluster 네임 스페이스에는 작동하지 않습니다
John

4

Windows 8에서 수행 한 모든 작업은 "원격 관리 사용자"그룹에 사용자가 추가되었으며 원격 WQL 요청이 작동했습니다.


1

기본적으로 로컬 관리자 그룹 만 WMI에 대한 원격 권한을 갖습니다. WMI "원격 활성화"권한을 사용자 정의해야합니다.


1

정확히 수행하려는 작업에 따라 "DCOM 원격 액세스 권한"및 / 또는 "DCOM 원격 실행 및 활성화 권한"을 부여해야 할 수도 있습니다. 이 MSDN 기사 는 단계별 절차를 제공합니다.


0

다음은 전체 도메인이 아닌 서버별로 만 수행했지만 2012 r2 도메인 환경에서 나에게 도움이되었습니다.

1) 성능 로그 사용자 그룹에 사용자를 추가하십시오. 2) wmimgmt.msc를 실행하고 "WMI Control (LOCAL)"을 마우스 오른쪽 단추로 클릭하고 보안 탭으로 이동 한 다음 원하는 네임 스페이스 (일반적으로 CIMV2)에 적절한 사용자 "계정 사용 가능"및 "원격 사용 가능"을 부여하십시오.

전체 도메인에 대해 완료하면 돌아와서 업데이트합니다.


0

선택한 답변을 바탕으로 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)" }

-1

PRTG를 위해이 작업을 수행했습니다. 새 도메인 사용자를 만들었습니다. GPO Dit를 만들어 사용자를 "Performnce Log Users"그룹에 넣고 Powershell 스크립트를 사용하여이 사용자를 WMI Control에 추가했습니다. 덕분에 :

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


답변에 직접 관련 정보를 포함하십시오. 게시 된 답변은 독립적으로 사용할 수 있어야하며 참조 용 링크 만 사용하십시오.
Cory Knutson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.