winrm 및 Microsoft.Update.Session을 사용하여 서버를 원격으로 패치 할 때 발생하는 문제 로컬로 관리자 권한으로 실행하면 아무런

Windows 2003, 2008 및 2008r2 서버가있는 네트워크가 있습니다. “Microsoft.Update”com 개체를 사용하여 로컬 컴퓨터를 패치하기 위해 작성한 powershell 스크립트가 있습니다. ( Windows Update PowerShell Remoting과 유사합니다 .) 스크립트는 로컬에서 훌륭하게 작동하지만 관리 할 서버가 많으므로 원격으로 해당 기능을 사용하고 싶습니다. 이 경우에는 해결되지 않은 다른 게시물과 유사하게 떨어집니다.

그러나 특정 클래스에서 두 가지 방법으로 실패 범위를 좁힐 수있었습니다.

(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()

Powershell에서 로컬로 관리자 권한으로 실행하면 아무런 문제가 없습니다. invoke-command (또는 enter-session 또는 winrs)를 사용하려고하면 다음 오류가 발생합니다. (이것은 localhost로 테스트 중이지만 모든 호스트가 수행합니다. credssp 및 kerberos와 같은 다른 인증 방법으로 시도했습니다.);

PS C:\> Invoke-Command -ComputerName localhost -ScriptBlock { (New-Object -ComObject "microsoft.update.session").createUpdateDownloader()}
Exception calling "CreateUpdateDownloader" with "0" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005
 (E_ACCESSDENIED))"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

나는 이것이 블로그에서 버그로 언급 된 것을 보았지만 그 주장을 뒷받침하지는 않았다. 두 가지 해결 방법이 있으며 둘 다 나를 행복하게하지 않습니다.

  • psexec를 사용하여 시스템 사용자로 명령을 실행하십시오. PSExec은 신뢰할 수없는 것으로 판명되었으므로 사용하지 않으려 고합니다. 또한 순수한 powershell 솔루션을 원합니다.
  • 예약 된 작업을 작성하고 시스템 사용자로 스크립트를 실행하도록 지시하십시오. ( 그의 게시물을 통해 ) 이것은 지저분 할뿐만 아니라 업데이트 결과를 얻지 못합니다. 파일에 로그인하거나 데이터베이스 등을 업데이트해야합니다.

호스트에서 원격으로 업데이트를 실행하는 다른 방법이 열려 있습니다. 많은 사람들이 겪고있는 문제인 것 같습니다.

메시지를 설명하지만 그 이유나 해결 방법이 아닌 일부 문서 를 찾았습니다 .

반환 값 성공하면 S_OK를 반환합니다. 그렇지 않으면 COM 또는 Windows 오류 코드를 반환합니다.

This method can also return the following error codes.
Return code   Description
E_INVALIDARGA parameter value is invalid.
E_ACCESSDENIED    This method cannot be called from a remote computer.

내가 원격 컴퓨터에 있다는 것을 어떻게 알 수 있습니까?



답변

MS는 WUApi를 통해 할 수 없기 때문에 친구는 할 수 없습니다.

자세한 내용은 여기를 참조하십시오 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx

예약 된 작업을 사용하여이 작업을 수행 할 수 있습니다.


답변

이러한 명령은 원격 시스템에서 권한을 가지고 실행해야하며, 원격 시스템에서 도메인 관리자 또는 관리자로 실행해야합니다.

첫 번째 경우 도움이 없지만 원격 get-credential이 아닌 로컬 관리자만 이처럼 사용 하십시오.

$cred = get-credential

Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}

대체적이고보다 직접적인 양식은 Invoke-Command자격 증명을 요청하는 것입니다.

Invoke-Command -scriptblock {$ENV:username} -Credential ""

답변

원격 서버에서 로컬 가상 계정으로 실행되도록 JEA 끝점을 설정하여이 작업을 수행 할 수있었습니다.

에서 https://docs.microsoft.com/en-us/powershell/jea/session-configurations :

로컬 가상 계정

이 JEA 끝점에서 지원하는 역할이 모두 로컬 컴퓨터를 관리하는 데 사용되고 로컬 관리자 계정으로 명령을 성공적으로 실행하기에 충분하면 로컬 가상 계정을 사용하도록 JEA를 구성해야합니다. 가상 계정은 특정 사용자에게 고유 한 임시 계정으로 PowerShell 세션 기간 동안 만 지속됩니다. 구성원 서버 또는 워크 스테이션에서 가상 계정은 로컬 컴퓨터의 Administrators 그룹에 속하며 대부분의 시스템 리소스에 액세스 할 수 있습니다. Active Directory 도메인 컨트롤러에서 가상 계정은 도메인의 Domain Admins 그룹에 속합니다.