ユーザーがリモートマシンでWMIにアクセスするには、どの許可/権利が必要ですか?


33

WMIを使用してリモートマシンから情報を取得する監視サービスを作成しています。これらすべてのマシンでローカル管理者権限を持つことは、政治的な理由から不可能です。

これは可能ですか?ユーザーはこれにどのような許可/権利を必要としますか?

回答:


31

以下は、Windows 2003 R2 SP 2、Windows Server 2012 R2で動作します

  1. 問題のユーザーをパフォーマンスモニターユーザーグループに追加します。
  2. [サービスとアプリケーション]で、WMIコントロールのプロパティダイアログを開きます(または実行しますwmimgmt.msc)。[セキュリティ]タブでRoot/CIMV2、[セキュリティ]をクリックします。追加 のパフォーマンスモニターのユーザーをとオプションを有効にしますEnable Accountし、Remote Enable
  3. を実行しますdcomcnfg。コンポーネントサービス>コンピュータ>マイコンピュータでは、プロパティのCOMセキュリティ]タブで、両方のための「制限の編集」をクリックし、ダイアログAccess PermissionsなどをLaunch and Activation Permissions。パフォーマンスモニターユーザーを追加し、リモートアクセス、リモート起動、およびリモートアクティベーションを許可します。
  4. コンポーネントサービス>コンピュータ>マイコンピュータ> DCOM構成の下でのWindows Management Instrumentationのを選択し、与えるRemote LaunchRemote Activationの特権パフォーマンスモニターのユーザーグループ。

ノート:

  • ステップ3および4の代替として、ユーザーをグループDistributed COM Users(Windows Server 2012 R2でテスト済み)に割り当てることができます。
  • ユーザーがすべての名前空間にアクセスする必要がある場合は、Rootレベルで設定を2.に設定し、次のAdvancedウィンドウでサブ名前空間へのアクセス許可を再帰できます。Security

1
ユーザーを分散COMユーザーに追加する場合、手順2と3は不要であることがわかりました。
ネクサス

WinXPとWin7で作業しているときに、「Distributed COM Users」グループを追加できませんでした-このグループはサーバーでのみアクセスできますか?アクセス許可に追加しようとすると、名前の検索中に解決されません。また、「ルート」と「ルート/ CIMV2」にWMIのアクセス許可を設定する必要があり、高度なアクセス許可に移動して、サブ名前空間と名前空間のアクセス許可を適用する必要がありました。
シャノンワーグナー

Windows 8でも動作します!また、誰かがpowershellまたは他のシェルから同じことをする方法を知っていますか?
Bunyk

1
ユーザーがすべての名前空間にアクセスできるようにする場合、ルートを選択し、セキュリティを開き、次に詳細設定を開き、再帰を設定することで、ルートおよびすべてのサブ名前空間にアクセス許可を付与できます。デフォルトでは、これらの設定は選択したオブジェクトにのみ適用され、カスケードされません
トーマス14

MSCluster名前空間では機能しません
ジョン

4

Windows 8で行ったことは、ユーザーをグループ「リモート管理ユーザー」に追加するだけで、リモートWQL要求は機能しました。


1

既定では、ローカルのAdministratorsグループのみが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でこれを行いました。新しいドメインユーザーを作成しました。ユーザーをグループ "Performnce Log Users"に入れるGPO Ditを作成し、PowerShellスクリプトを使用してこのユーザーをWMIコントロールに追加しました。おかげで:

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


回答に関連情報を直接含めてください。投稿された回答は独立したものであり、参照用のリンクを使用する必要があります。
コリーナッツソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.