성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Windows 10+에서 WMI root/Microsoft/Windows/WindowsUpdate 네임스페이스 제거</h1> <p> 아래의 글을 쓸 때만 해도,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > WMI Namespace를 열거하고, 그 안에 정의된 클래스를 열거하는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12451'>https://www.sysnet.pe.kr/2/0/12451</a> </pre> <br /> "ROOT\Microsoft\Windows\WindowsUpdate" 네임스페이스가 있었는데, 근래의 Windows 10+에서 실습해 보니까 없어졌습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\System32> <span style='color: blue; font-weight: bold'>Get-WmiObject -Namespace Root/Microsoft/Windows -Class __Namespace | Select-Object -Property Name</span> Name ---- RemoteAccess Dns Powershellv3 Hgs DeviceGuard TaskScheduler DesiredStateConfigurationProxy SmbWitness Wdac winrm AppBackgroundTask PS_MMAgent Storage HardwareManagement SMB EventTracingManagement DesiredStateConfiguration Attestation CI DeliveryOptimization Defender </pre> <br /> 다음의 글에 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows update change in Server 1709 ; <a target='tab' href='https://richardspowershellblog.wordpress.com/2017/11/17/windows-update-change-in-server-1709/'>https://richardspowershellblog.wordpress.com/2017/11/17/windows-update-change-in-server-1709/</a> Scan, download and install Windows Updates with PowerShell ; <a target='tab' href='https://4sysops.com/archives/scan-download-and-install-windows-updates-with-powershell/'>https://4sysops.com/archives/scan-download-and-install-windows-updates-with-powershell/</a> </pre> <br /> 1709 업데이트에서 변화가 있긴 하지만, 그래도 "root/microsoft/windows/windowsupdate" 네임스페이스가 있는 것으로는 나옵니다. 실제로, Windows Server 2019에서는 위의 내용이 그대로 잘 실행이 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\> <span style='color: blue; font-weight: bold'>Get-Module -Name *Update*</span> ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Manifest 1.0.0.2 WindowsUpdateProvider {Get-WUAVersion, Get-WUIsPendingReboot, Get-WULastInstalla... PS C:\> <span style='color: blue; font-weight: bold'>Get-Command -Module WindowsUpdateProvider</span> 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 </pre> <br /> 하지만 좀 더 살펴 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > start-wuscan cmdlet is not avialble to run on few Windows 10 ; <a target='tab' href='https://docs.microsoft.com/en-us/answers/questions/212035/start-wuscan-cmdlet-is-not-avialble-to-run-on-few.html'>https://docs.microsoft.com/en-us/answers/questions/212035/start-wuscan-cmdlet-is-not-avialble-to-run-on-few.html</a> </pre> <br /> 2004 (20H1) 버전부터 PowerShell에서 제공하던 "WindowsUpdateProvider"가 제거되었다고 합니다. 아마도 이것은 WMI 네임스페이스에서 "root/Microsoft/Windows/WindowsUpdate" 항목이 없어진 것과 맥락을 같이 하는 것 같습니다. 왜냐하면, WindowsUpdateProvider의 "MSFT_WUOperations.psm1" 소스 코드를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # 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 <span style='color: blue; font-weight: bold'>root/Microsoft/Windows/WindowsUpdate</span> -ClassName MSFT_WUOperations -MethodName ScanForUpdates } else { $scanres = Invoke-CimMethod -Namespace <span style='color: blue; font-weight: bold'>root/Microsoft/Windows/WindowsUpdate</span> -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" } } </pre> <br /> "root/Microsoft/Windows/WindowsUpdate"를 기반으로 동작하고 있는데, 이러한 PowerShell 모듈을 없앤 데에는 아무래도 그것이 사용하는 WMI 클래스가 없어진 이유 때문이 아닌가 짐작을 하게 됩니다.<br /> <br /> 이와 함께 "<a target='tab' href='https://docs.microsoft.com/en-us/answers/questions/212035/start-wuscan-cmdlet-is-not-avialble-to-run-on-few.html'>start-wuscan cmdlet is not avialble to run on few Windows 10</a>" 글에서는 우회 방법으로 "Microsoft.Update.Session" COM 개체를 사용하는 것을 제시하고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $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 </pre> <br /> 음... 어쩔 수 없을 것 같습니다. WindowsUpdate 클래스가 사라진 이상, 원래의 COM 개체를 이용한 방법을 사용하는 수밖에.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
8215
(왼쪽의 숫자를 입력해야 합니다.)