Quais permissões / direitos um usuário precisa ter acesso WMI em máquinas remotas?
33
Estou escrevendo um serviço de monitoramento que usa o WMI para obter informações de máquinas remotas. Ter direitos de administrador local em todas essas máquinas não é possível por razões políticas.
Isso é possível? Quais permissões / direitos meu usuário exige para isso?
O seguinte funciona no Windows 2003 R2 SP 2, Windows Server 2012 R2
Adicione o (s) usuário (s) em questão ao grupo Usuários do Monitor de Desempenho
Em Serviços e aplicativos, abra a caixa de diálogo de propriedades do Controle WMI (ou execute wmimgmt.msc). Na guia Segurança, realce Root/CIMV2, clique em Segurança; adicione Usuários do Monitor de Desempenho e ative as opções: Enable AccounteRemote Enable
Corra dcomcnfg. Em Serviços de componentes> Computadores> Meu computador, na guia Segurança COM da caixa de diálogo Propriedades, clique em "Editar limites" para ambos Access Permissionse Launch and Activation Permissions. Adicione Usuários do Monitor de Desempenho e permita acesso remoto, inicialização remota e ativação remota.
Selecione Instrumentação de Gerenciamento do Windows em Serviços de Componentes> Computadores> Meu Computador> Configuração do DCOM e conceda Remote Launche Remote Activationprivilégios ao Grupo de Usuários do Monitor de Desempenho .
Notas:
Como alternativa às etapas 3 e 4, é possível atribuir o usuário ao grupo Usuários COM Distribuídos (Testado no Windows Server 2012 R2)
Se o usuário precisar acessar todos os espaços para nome, você poderá definir as configurações em 2. no Rootnível e recursar as permissões para os subdomínios através da Advancedjanela emSecurity
Descobri que as etapas 2 e 3 não são necessárias se você adicionar o usuário a Usuários COM Distribuídos.
Nexus
Trabalhando no WinXP e Win7, não foi possível adicionar o grupo "Usuários COM Distribuídos" - talvez esse grupo esteja acessível apenas em servidores? Não seria resolvido durante a pesquisa de nome ao tentar adicionar às permissões. Além disso, descobri que precisava definir permissões para o WMI em "Raiz" e "Raiz / CIMV2" e que precisava entrar em permissões avançadas e aplicar a permissão para os subnamespaces e para o namespace.
21712 Shannon Wagner
Funciona também para Windows 8! Além disso, alguém sabe como fazer o mesmo com o PowerShell ou algum outro shell?
Bunyk
1
Caso deseje que um usuário possa acessar todo o espaço para nome, você pode conceder a permissão ao Root e a todos os subdomínios selecionando Root, abrindo Segurança e depois Avançado e configurando a recursão. Por padrão, essas configurações se aplicam apenas ao objeto selecionado e não se conectam em cascata.
Thomas
que não funciona para MSCluster namespace
John
4
Tudo o que fiz no Windows 8 foi adicionado usuário ao grupo "Usuários de gerenciamento remoto", e as solicitações remotas de WQL funcionaram.
Por padrão, apenas o grupo local Administradores tem permissões remotas para o WMI. Você precisará personalizar as permissões "Ativação remota" do WMI.
Você também pode precisar conceder "permissões de acesso remoto ao DCOM" e / ou "permissões de inicialização e ativação remota do DCOM", dependendo do que exatamente você está tentando fazer. Este artigo do MSDN fornece os procedimentos passo a passo.
O seguinte funcionou para mim em um ambiente de domínio R2 de 2012, embora eu só tenha conseguido fazê-lo por servidor e não por todo o domínio:
1) Adicione o usuário ao grupo de usuários do log de desempenho. 2) Execute wmimgmt.msc, clique com o botão direito do mouse em "WMI Control (LOCAL), vá para a guia Security e conceda ao usuário apropriado" Enable Account "e" Remote Enable "no espaço para nome desejado (normalmente CIMV2).
Se eu conseguir fazer isso para todo o domínio, voltarei e atualizarei.
Com base na resposta escolhida, modifiquei o script da Microsoft para definir a segurança WMI. Meu usuário de teste era um usuário de domínio não administrativo e membro dos "Usuários de Gerenciamento Remoto" no sistema local por motivos não relacionados a esse problema. Depois de conceder ao meu usuário as permissões EnableAccount, RemoteEnable e ExecuteMethods no espaço de nome de destino, consegui acessar o WMI.
Portanto, não adicionei meu usuário aos grupos locais Usuários do Monitor de Desempenho ou Usuários COM Distribuídos .
Algumas notas sobre o script:
Você deve especificar o caminho completo do espaço para nome. No meu caso, o espaço para nome era Root / Microsoft / SqlServer
A herança estava errada. Porque não há objetos de folha que você não pode usar$OBJECT_INHERIT_ACE_FLAG
Eu me livrei da função incorporada porque era muito pequena e foi usada apenas uma vez.
O script está abaixo. Eu o nomeei 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)" }
Fizemos isso no PRTG: Criamos um novo usuário de domínio: Criamos um GPO Dit para colocar seu usuário no grupo "Performnce Log Users" e usamos um script do PowerShell para adicionar esse usuário ao controle WMI. graças a:
Tudo o que fiz no Windows 8 foi adicionado usuário ao grupo "Usuários de gerenciamento remoto", e as solicitações remotas de WQL funcionaram.
fonte
Por padrão, apenas o grupo local Administradores tem permissões remotas para o WMI. Você precisará personalizar as permissões "Ativação remota" do WMI.
fonte
Você também pode precisar conceder "permissões de acesso remoto ao DCOM" e / ou "permissões de inicialização e ativação remota do DCOM", dependendo do que exatamente você está tentando fazer. Este artigo do MSDN fornece os procedimentos passo a passo.
fonte
O seguinte funcionou para mim em um ambiente de domínio R2 de 2012, embora eu só tenha conseguido fazê-lo por servidor e não por todo o domínio:
1) Adicione o usuário ao grupo de usuários do log de desempenho. 2) Execute wmimgmt.msc, clique com o botão direito do mouse em "WMI Control (LOCAL), vá para a guia Security e conceda ao usuário apropriado" Enable Account "e" Remote Enable "no espaço para nome desejado (normalmente CIMV2).
Se eu conseguir fazer isso para todo o domínio, voltarei e atualizarei.
fonte
Com base na resposta escolhida, modifiquei o script da Microsoft para definir a segurança WMI. Meu usuário de teste era um usuário de domínio não administrativo e membro dos "Usuários de Gerenciamento Remoto" no sistema local por motivos não relacionados a esse problema. Depois de conceder ao meu usuário as permissões EnableAccount, RemoteEnable e ExecuteMethods no espaço de nome de destino, consegui acessar o WMI.
Portanto, não adicionei meu usuário aos grupos locais Usuários do Monitor de Desempenho ou Usuários COM Distribuídos .
Algumas notas sobre o script:
$OBJECT_INHERIT_ACE_FLAG
O script está abaixo. Eu o nomeei Set-WMINamespaceSsecurity.ps1
fonte
Fizemos isso no PRTG: Criamos um novo usuário de domínio: Criamos um GPO Dit para colocar seu usuário no grupo "Performnce Log Users" e usamos um script do PowerShell para adicionar esse usuário ao controle WMI. graças a:
https://live.paloaltonetworks.com/t5/Management-Articles/PowerShell-Script-for-setting-WMI-Permissions-for-User-ID/ta-p/53646
fonte