Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

Windows 10+에서 WMI root/Microsoft/Windows/WindowsUpdate 네임스페이스 제거

아래의 글을 쓸 때만 해도,

WMI Namespace를 열거하고, 그 안에 정의된 클래스를 열거하는 방법
; https://www.sysnet.pe.kr/2/0/12451

"ROOT\Microsoft\Windows\WindowsUpdate" 네임스페이스가 있었는데, 근래의 Windows 10+에서 실습해 보니까 없어졌습니다.

PS C:\Windows\System32>  Get-WmiObject -Namespace Root/Microsoft/Windows -Class __Namespace | Select-Object -Property Name

Name
----
RemoteAccess
Dns
Powershellv3
Hgs
DeviceGuard
TaskScheduler
DesiredStateConfigurationProxy
SmbWitness
Wdac
winrm
AppBackgroundTask
PS_MMAgent
Storage
HardwareManagement
SMB
EventTracingManagement
DesiredStateConfiguration
Attestation
CI
DeliveryOptimization
Defender

다음의 글에 보면,

Windows update change in Server 1709
; https://richardspowershellblog.wordpress.com/2017/11/17/windows-update-change-in-server-1709/

Scan, download and install Windows Updates with PowerShell
; https://4sysops.com/archives/scan-download-and-install-windows-updates-with-powershell/

1709 업데이트에서 변화가 있긴 하지만, 그래도 "root/microsoft/windows/windowsupdate" 네임스페이스가 있는 것으로는 나옵니다. 실제로, Windows Server 2019에서는 위의 내용이 그대로 잘 실행이 됩니다.

PS C:\> Get-Module -Name *Update*

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   1.0.0.2    WindowsUpdateProvider               {Get-WUAVersion, Get-WUIsPendingReboot, Get-WULastInstalla...

PS C:\> Get-Command -Module WindowsUpdateProvider

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-WUAVersion                                     1.0.0.2    WindowsUpdateProvider
Function        Get-WUIsPendingReboot                              1.0.0.2    WindowsUpdateProvider
Function        Get-WULastInstallationDate                         1.0.0.2    WindowsUpdateProvider
Function        Get-WULastScanSuccessDate                          1.0.0.2    WindowsUpdateProvider
Function        Install-WUUpdates                                  1.0.0.2    WindowsUpdateProvider
Function        Start-WUScan                                       1.0.0.2    WindowsUpdateProvider

하지만 좀 더 살펴 보면,

start-wuscan cmdlet is not avialble to run on few Windows 10
; https://docs.microsoft.com/en-us/answers/questions/212035/start-wuscan-cmdlet-is-not-avialble-to-run-on-few.html

2004 (20H1) 버전부터 PowerShell에서 제공하던 "WindowsUpdateProvider"가 제거되었다고 합니다. 아마도 이것은 WMI 네임스페이스에서 "root/Microsoft/Windows/WindowsUpdate" 항목이 없어진 것과 맥락을 같이 하는 것 같습니다. 왜냐하면, WindowsUpdateProvider의 "MSFT_WUOperations.psm1" 소스 코드를 보면,

# This function's purpose is to take the output of the MI provider, an array of fixed size, and convert it to an array list of non-fixed size.
# The reason for this is so that a caller of this module is able to easily select which updates they wish to download & install
function Start-WUScan
{
    param
    (
        [parameter(Mandatory = $false)]
        $SearchCriteria
    )

    If($SearchCriteria -eq $null)
    {
        $scanres = Invoke-CimMethod -Namespace root/Microsoft/Windows/WindowsUpdate -ClassName MSFT_WUOperations -MethodName ScanForUpdates
    }
    else
    {
        $scanres = Invoke-CimMethod -Namespace root/Microsoft/Windows/WindowsUpdate -ClassName MSFT_WUOperations -MethodName ScanForUpdates -Arguments @{SearchCriteria=$SearchCriteria}
    }
    
    if($scanres.ReturnValue -eq 0)
    {
        $arrlist = New-Object System.Collections.ArrayList
        $arrlist.AddRange($scanres.Updates) | out-null

        # Comma is added to prevent powershell from converting return to an array
        return ,$arrlist
    }
    else
    {
        Write-Error "Scan hit error: $scanres.ReturnValue"
    }
}

"root/Microsoft/Windows/WindowsUpdate"를 기반으로 동작하고 있는데, 이러한 PowerShell 모듈을 없앤 데에는 아무래도 그것이 사용하는 WMI 클래스가 없어진 이유 때문이 아닌가 짐작을 하게 됩니다.

이와 함께 "start-wuscan cmdlet is not avialble to run on few Windows 10" 글에서는 우회 방법으로 "Microsoft.Update.Session" COM 개체를 사용하는 것을 제시하고 있습니다.

$Session = new-object -com "Microsoft.Update.Session"
$ctr = "(IsInstalled=0 and DeploymentAction=*) or (IsInstalled=1 and DeploymentAction=*) or (IsHidden=1 and DeploymentAction=*)"
$Result = $Session.CreateupdateSearcher().Search($ctr).Updates
$Result | Select Title,Identity,IsHidden,LastDeploymentChangeTime,KBArticleIDs | Format-List -Property Title,@{l='UpdateID';e={$_.Identity.UpdateID}},@{l='PublishedDate';e={$_.LastDeploymentChangeTime.ToString('yyyy-MM-dd')}},@{l='KBArticle';e={$_.KBArticleIDs}},IsHidden

음... 어쩔 수 없을 것 같습니다. WindowsUpdate 클래스가 사라진 이상, 원래의 COM 개체를 이용한 방법을 사용하는 수밖에.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 12/20/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  184  185  [186]  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
351정성태10/8/200624641개발 환경 구성: 16. 성태의 무식한(!) 리눅스 탐방기. [4]
349정성태9/26/200623189디버깅 기술: 10. C++/CLI에서 제공되는 명시적인 파괴자의 비밀
347정성태10/6/200627119디버깅 기술: 9. .NET IDisposable 처리 정리 [1]
346정성태9/23/200620491개발 환경 구성: 15. 툴박스에 컨트롤이 자동으로 나타나도록 해주는 옵션 설정
345정성태9/20/200619707오류 유형: 12. WCF 오류 메시지 - Error while trying to reflect on attribute 'MessageContractAttribute'
343정성태10/18/200631605개발 환경 구성: 14. SandCastle 사용법 (NDoc을 대체하는 문서화 도구) [1]파일 다운로드1
344정성태9/20/200621800    답변글 개발 환경 구성: 14.1. 오류 유형 - GAC 에 등록된 DLL 에 대한 문서화 시 오류
340정성태9/15/200621091개발 환경 구성: 13. ISO 파일을 가상 CD-ROM으로 매핑해주는 프로그램
339정성태9/14/200620565오류 유형: 11. ProtocolsSection?
338정성태2/4/200728742개발 환경 구성: 12. BUG: 웹 서비스에서 DataTable 사용하기 [2]파일 다운로드1
350정성태10/2/200621992    답변글 개발 환경 구성: 12.1. ASMX 2.0 and SchemaImporterExtensions파일 다운로드1
335정성태8/20/200629631디버깅 기술: 8. COM+ 서버 응용 프로그램에 대한 F5 디버깅 방법
334정성태8/20/200624853디버깅 기술: 7. VS.NET 2003/2005의 다중 프로젝트 디버깅
333정성태8/20/200625327개발 환경 구성: 11. COM+ 서버 활성화 보안 설정
331정성태8/27/200618272개발 환경 구성: 10. 최대 절전 모드와 VPC 네트워크 문제
330정성태8/20/200618608개발 환경 구성: 9. VPC로 구성하는 개인 환경
328정성태8/20/200636456개발 환경 구성: 8. AppVerifier 사용법 [1]
327정성태8/16/200633259개발 환경 구성: 7. ActiveX 서명 과정 자동화 [1]
326정성태8/16/200627106Team Foundation Server: 13. Sysnet 웹 사이트 TFS Migration
322정성태8/15/200621919개발 환경 구성: 6. 4GB 메모리 구성 [1]
316정성태9/20/200641206디버깅 기술: 6. .NET 예외 처리 정리 [6]
309정성태12/27/200642003디버깅 기술: 5. PDB 이야기 [7]
310정성태8/5/200628967    답변글 디버깅 기술: 5.1. PDB 파일에 따른 Debug 정보 - WinForm + Library 유형의 프로젝트파일 다운로드1
311정성태8/10/200628563    답변글 디버깅 기술: 5.2. PDB 파일에 따른 Debug 정보 - .NET 2.0 Web Application Project + Library 유형의 프로젝트
312정성태8/5/200631277    답변글 디버깅 기술: 5.3. PDB 파일에 따른 Debug 정보 - .NET 2.0 Web Site Model 유형의 프로젝트
313정성태8/12/200630420    답변글 디버깅 기술: 5.4. VS.NET 2005 디버그 모드에서의 PDB 파일 사용 차이 (1)
... 181  182  183  184  185  [186]  187  188  189  190  191  192  193  194  195  ...