WMI를 사용하여 원격 컴퓨터에서 정보를 얻는 모니터링 서비스를 작성 중입니다. 정치적 이유로 이러한 모든 컴퓨터에 대한 로컬 관리자 권한을 갖는 것은 불가능합니다.
이것이 가능한가? 사용자에게 필요한 권한 / 권한은 무엇입니까?
답변
다음은 Windows 2003 R2 SP 2, Windows Server 2012 R2에서 작동합니다.
- 해당 사용자를 Performance Monitor Users 그룹에 추가
- 서비스 및 응용 프로그램에서 WMI 컨트롤의 속성 대화 상자를 불러옵니다 (또는 실행
wmimgmt.msc
). 보안 탭에서을 강조 표시하고 보안을Root/CIMV2
클릭하십시오. 추가 성능 모니터 사용자를 하고 옵션을 활성화합니다Enable Account
및Remote Enable
- 를 실행하십시오
dcomcnfg
. 구성 요소 서비스> 컴퓨터> 내 컴퓨터에서 속성 대화 상자의 COM 보안 탭에서Access Permissions
및에 대해 “제한 편집”을 클릭하십시오Launch and Activation Permissions
. 성능 모니터 사용자를 추가하고 원격 액세스, 원격 실행 및 원격 활성화를 허용하십시오. - 구성 요소 서비스> 컴퓨터> 내 컴퓨터> DCOM 구성에서 Windows 관리 계측을 선택하여 제공
Remote Launch
하고Remote Activation
특권 성능 모니터 사용자 그룹.
노트:
- 3 단계와 4 단계의 대안으로 사용자를 Distributed COM Users 그룹에 할당 할 수 있습니다 (Windows Server 2012 R2에서 테스트).
- 사용자가 모든 네임 스페이스에 액세스해야하는 경우
Root
레벨 에서 2.의 설정을 설정하고 의Advanced
창을 통해 하위 네임 스페이스에 대한 권한을 되풀이 할 수 있습니다.Security
답변
Windows 8에서 수행 한 모든 작업은 “원격 관리 사용자”그룹에 사용자가 추가되었으며 원격 WQL 요청이 작동했습니다.
답변
기본적으로 로컬 관리자 그룹 만 WMI에 대한 원격 권한을 갖습니다. WMI “원격 활성화”권한을 사용자 정의해야합니다.
답변
정확히 수행하려는 작업에 따라 “DCOM 원격 액세스 권한”및 / 또는 “DCOM 원격 실행 및 활성화 권한”을 부여해야 할 수도 있습니다. 이 MSDN 기사 는 단계별 절차를 제공합니다.
답변
다음은 전체 도메인이 아닌 서버별로 만 수행했지만 2012 r2 도메인 환경에서 나에게 도움이되었습니다.
1) 성능 로그 사용자 그룹에 사용자를 추가하십시오. 2) wmimgmt.msc를 실행하고 “WMI Control (LOCAL)”을 마우스 오른쪽 단추로 클릭하고 보안 탭으로 이동 한 다음 원하는 네임 스페이스 (일반적으로 CIMV2)에 적절한 사용자 “계정 사용 가능”및 “원격 사용 가능”을 부여하십시오.
전체 도메인에 대해 완료하면 돌아와서 업데이트합니다.
답변
선택한 답변을 바탕으로 Microsoft의 스크립트를 수정하여 WMI 보안을 설정했습니다. 테스트 사용자는 이 문제 와 관련 이 없는 이유로 로컬 시스템에서 “원격 관리 사용자”의 구성원 인 비 관리 도메인 사용자였습니다 . 대상 네임 스페이스에 대한 EnableAccount, RemoteEnable 및 ExecuteMethods 권한을 사용자에게 부여한 후 WMI에 액세스 할 수있었습니다.
따라서 성능 모니터 사용자 또는 분산 COM 사용자 로컬 그룹에 사용자를 추가 하지 않았습니다 .
스크립트에 관한 몇 가지 참고 사항 :
- 네임 스페이스의 전체 경로를 지정해야합니다. 필자의 경우 네임 스페이스는 Root / Microsoft / SqlServer였습니다.
- 상속이 잘못되었습니다. 잎 개체가 없기 때문에 사용할 수 없습니다
$OBJECT_INHERIT_ACE_FLAG
- 너무 작아서 한 번만 사용 되었기 때문에 내장 함수를 제거했습니다.
스크립트는 다음과 같습니다. 이름을 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)" }
답변
PRTG를 위해이 작업을 수행했습니다. 새 도메인 사용자를 만들었습니다. GPO Dit를 만들어 사용자를 “Performnce Log Users”그룹에 넣고 Powershell 스크립트를 사용하여이 사용자를 WMI Control에 추가했습니다. 덕분에 :