1

Get-WmiObject Win32_Service를 사용하여 실행중인 서비스와 현재 상태를 열거하는 Powershell 스크립트가 있습니다. this one에 기초한 초기 버전으로 Azure 용으로 수정되었습니다. 내 위치 컴퓨터에서 Powershell (하늘색 자동화 부분없이) 스크립트를 실행할 때 제대로 작동하고 관심있는 모든 컴퓨터에 연결할 수 있지만 런북으로 포팅하면 다음과 같은 오류가 발생합니다. "Get-WmiObject : RPC 서버를 사용할 수 없습니다. "Azure Runbook을 사용하는 Azure VM의 모니터링 서비스

Q : 자동화 계정의 사용 권한에 문제가 있습니까? 그렇다면 문제를 해결하기 위해 로컬 컴퓨터에 어떤 계정을 추가해야합니까?

Q : Get-WmiObject가 연결을 시작하는 올바른 방법이 아닙니까? 그렇지 않다면 대신 무엇을 시도해야합니까?

내가 사용하는 코드는 다음과 같습니다 :

[CmdletBinding(SupportsShouldProcess = $true)] 
param(

    # Servers to check 
    [Parameter(Mandatory=$true)][string[]]$ServerList, 

    # Services to check for 
    [Parameter(Mandatory=$true)][string[]]$includeService 
    ) 

# Following modifies the Write-Verbose behavior to turn the messages on globally for this session 
$VerbosePreference = "Continue" 

$connectionName = "AzureRunAsConnection" 

# retry 
$retry = 6 
$syncOk = $false 

$servicePrincipalConnection = Get-AutomationConnection -Name $connectionName 
do 
{ 
    try 
    { 
     Add-AzureRmAccount -ServicePrincipal -TenantId $servicePrincipalConnection.TenantId -ApplicationId $servicePrincipalConnection.ApplicationId -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
     $syncOk = $true 
    } 
    catch 
    { 
     $ErrorMessage = $_.Exception.Message 
     $StackTrace = $_.Exception.StackTrace 
     Write-Warning "Error during sync: $ErrorMessage, stack: $StackTrace. Retry attempts left: $retry" 
     $retry = $retry - 1  
     Start-Sleep -s 60   
    } 
} while (-not $syncOk -and $retry -ge 0) 

Select-AzureRMSubscription -SubscriptionId $SubscriptionId -TenantId $servicePrincipalConnection.TenantId 
$currentSubscription = Get-AzureRMSubscription -SubscriptionId $SubscriptionId -TenantId $servicePrincipalConnection.TenantId 
Set-AzureRmContext -SubscriptionId $SubscriptionId; 

[email protected]() 

[System.Collections.ArrayList]$unreachableServers = @() 

Foreach($ServerName in ($ServerList)) 
{ 
    try 
    { 
     $service = Get-WmiObject Win32_Service -ComputerName $servername 
    } 
    catch 
    {} 

    if ($Service -ne $NULL) 
    { 
     foreach ($item in $service) 
     { 
      #$item.DisplayName 
      Foreach($include in $includeService) 
      {       
        #write-host $include          
       if(($item.name).Contains($include) -eq $TRUE) 
       { 
        $props += [pscustomobject]@{ 
        servername = $ServerName 
        name = $item.name 
        Status = $item.Status 
        startmode = $item.startmode 
        state = $item.state 
        serviceaccount=$item.startname 
        DisplayName =$item.displayname} 
       } 
      } 
     } 
    } 
    else 
    { 
     Write-host "Failed to contact server: "$ServerName 
     $unreachableServers.Add($ServerName) 
    } 
} 

$props | Format-Table Servername,Name,startmode,state,serviceaccount,displayname -AutoSize 

답변

0

저는 Azure Automation Hybrid Worker 기능을 사용한다고 가정합니다. 기본적으로 시스템 계정으로 실행됩니다. 그러나 다른 계정을 사용하여 runbook을 실행할 수 있습니다. 여기에 설명되어 있습니다 : Azure Automation Hybrid Worker; RunAs 계정 섹션을보십시오. 직접 시도 할 때 작동하는 동일한 계정을 사용하십시오.

+0

예, 이것이 결국 제가 해결할 해결책입니다. 요약하면 다음과 같습니다. 1) 사용자 지정 하이브리드 작업자 그룹을 만들었습니다. 2) 해당 그룹에 AD 자격 증명을 연결하여 해당 컴퓨터에 대한 사용 권한을 얻었습니다. 3) "RunAs"매개 변수가있는 하이브리드 작업자 그룹에서 런북을 실행했습니다. – user2766185

0

는 OMS를 사용하여 고려 했는가? 이것은 더 나은 일이라고 들립니다.

어쨌든 질문에 대답하기 위해 로컬 사용자를 만들고 해당 사용자가 연결할 PS 구성 끝점을 만들어 자동화 계정에서 해당 사용자로 가장 연결할 수 있지만 다시 시도하지는 않습니다. 이 경로는 차라리 OMS을 사용합니다.

+0

Windows 서비스가 중지되거나 충돌하는 경우 항상 이벤트 로그에 기록합니까? – user2766185

+0

은 서비스에 따라 달라집니다. 분명히 – 4c74356b41

+0

OMS는 서비스를 직접 확인하여 상태를 확인 할 수 있습니까? 그렇지 않으면 서비스가 모든 상태 변경 사항을 기록하지 않으면 OMS가 서비스 충돌을 놓칠 수있는 반면보다 직접적인 접근 방식이 더 신뢰할 수있게 작동하는 것처럼 보일 수 있습니다. – user2766185

관련 문제