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


33

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

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

답변:


31

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

  1. 해당 사용자를 Performance Monitor Users 그룹에 추가
  2. 서비스 및 응용 프로그램에서 WMI 컨트롤의 속성 대화 상자를 불러옵니다 (또는 실행 wmimgmt.msc). 보안 탭에서을 강조 표시하고 보안을 Root/CIMV2클릭하십시오. 추가 성능 모니터 사용자를 하고 옵션을 활성화합니다 Enable Account및Remote 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.