Windows 업데이트의 적용 가능성 규칙을 프로그래밍 방식으로 확인하는 방법은 무엇입니까?
Windows update .msu 파일(예: 7zip과 같은 도구 사용)의 내용을 탐색하면 여러 파일 중에서 필수 구성 요소와 적용 가능성 규칙을 정의하는 파일을 찾을 수 있습니다.예를 들어,
<UpdateIdentity UpdateID="E6CF1350-C01B-414D-A61F-263D14D133B4" RevisionNumber="1" /><Properties UpdateType="Category" /><ApplicabilityRules><IsInstalled><True /></IsInstalled></ApplicabilityRules>
....
<UpdateIdentity UpdateID="2bf7ed9c-6f43-493a-b156-db20f08c44c4" RevisionNumber="101" /><Properties UpdateType="Detectoid" /><Relationships /><ApplicabilityRules><IsInstalled><b.RegSz Key="HKEY_LOCAL_MACHINE" Subkey="SYSTEM\CurrentControlSet\Control\Nls\Language" Value="InstallLanguage" Comparison="EqualTo" Data="0409" /></IsInstalled></ApplicabilityRules>
....
<UpdateIdentity UpdateID="6AECE9A4-19E3-4BC7-A20C-070A5E31AFF4" RevisionNumber="100" /><Properties UpdateType="Detectoid" /><Relationships>
...
<UpdateIdentity UpdateID="3B4B8621-726E-43A6-B43B-37D07EC7019F" /><ApplicabilityRules><IsInstalled><b.WmiQuery Namespace="root\cimv2" WqlQuery="SELECT Manufacturer FROM Win32_ComputerSystem WHERE Manufacturer = 'Samsung Electronics' or Manufacturer = 'Hewlett-Packard' or Manufacturer = 'Gateway'" /></IsInstalled></ApplicabilityRules>
...
특정 .msu 파일과 내 로컬 컴퓨터가 주어졌을 때, 이러한 규칙을 반복하고 규칙이 만족스럽지 않은지 확인할 수 있는 방법이 있습니까?
WSUS 3.0 클래스 라이브러리를 이 용도로 사용할 수 있습니까?아니면 도구/스크립트가 있습니까?
제가 실제로 원하는 것은 컴퓨터가 어떤 조건으로 특정 Windows 업데이트(KB2973201)를 거부했는지 정확히 아는 것입니다. 업데이트는 컴퓨터에 적용할 수 없습니다(뒤에 있는 오류 코드는 WU_E_NOT_APPLIBLE).
업데이트의 적용 가능성 규칙에 대한 문서가 너무 적은 것 같습니다.좋은 자료가 있습니까?
참조:
특정 .msu 파일과 내 로컬 컴퓨터가 주어졌을 때, 이러한 규칙을 반복하고 규칙이 만족스럽지 않은지 확인할 수 있는 방법이 있습니까?
WSUS 3.0 클래스 라이브러리를 이 용도로 사용할 수 있습니까?아니면 도구/스크립트가 있습니까?
WSUS 3.0 클래스 라이브러리를 통해 적용 가능성 규칙을 업데이트할 수 있습니다. WSUS 3.0 클래스 라이브러리는 설치 프로그램을 실행하지만 실패한 규칙을 알려주지 않는 한 규칙이 통과되는지 확인하는 기능을 제공하지 않습니다.
사이먼은 WUAPI 라이브러리가 내부 규칙을 노출하지 않으며(faik) WUAPI ResultCode를 실패한 적용성 규칙에 일치시킬 방법이 없다고 언급했습니다.
그리고 불행하게도 도서관은Microsoft.Deployment.WindowsInstaller.dll
MSU 파일로는 작동하지 않기 때문에 "비품종" 옵션이 없습니다.따라서 코드와 (msu.xml) XML 파일을 사용하여 수동으로 작업해야 합니다.
<Updates>
<UpdateIdentity UpdateID="E6CF1350-C01B-414D-A61F-263D14D133B4" RevisionNumber="1" />
<Properties UpdateType="Category" />
<ApplicabilityRules>
<IsInstalled>
<True />
</IsInstalled>
</ApplicabilityRules>
<UpdateIdentity UpdateID="2bf7ed9c-6f43-493a-b156-db20f08c44c4" RevisionNumber="101" />
<Properties UpdateType="Detectoid" />
<Relationships />
<ApplicabilityRules>
<IsInstalled>
<b.RegSz Key="HKEY_LOCAL_MACHINE" Subkey="SYSTEM\CurrentControlSet\Control\Nls\Language" Value="InstallLanguage" Comparison="EqualTo" Data="0409" />
</IsInstalled>
</ApplicabilityRules>
<UpdateIdentity UpdateID="6AECE9A4-19E3-4BC7-A20C-070A5E31AFF4" RevisionNumber="100" />
<Properties UpdateType="Detectoid" />
<Relationships></Relationships>
<UpdateIdentity UpdateID="3B4B8621-726E-43A6-B43B-37D07EC7019F" />
<ApplicabilityRules>
<IsInstalled>
<b.WmiQuery Namespace="root\cimv2" WqlQuery="SELECT Manufacturer FROM Win32_ComputerSystem WHERE Manufacturer = 'Dell Inc.' or Manufacturer = 'Samsung Electronics' or Manufacturer = 'Hewlett-Packard' or Manufacturer = 'Gateway'" />
</IsInstalled>
</ApplicabilityRules>
</Updates>
이 코드를 사용하여 어떤 적용성 규칙이 실패하는지 확인합니다.
private void btnWillPassApplicabilityRules_Click(object sender, EventArgs e)
{
XDocument doc = XDocument.Load("msu.xml");
var elements = doc.Element("Updates").Elements("ApplicabilityRules").Elements("IsInstalled").Elements();
foreach (var element in elements) {
if (element.ToString().StartsWith("<b.RegSz")) {
string subKeyName = element.Attribute("Subkey").Value;
string keyName = element.Attribute("Value").Value;
string keyValue = element.Attribute("Data").Value;
//TODO: Leave the Registry Hive "Switch()" upto reader to fully implement
if (!ValueExistsInRegistry(Registry.LocalMachine, subKeyName, keyName, keyValue)) {
Console.WriteLine("Install is not applicable as Applicability Rule failed: " + element.ToString());
}
}
else if (element.ToString().StartsWith("<b.WmiQuery")) {
string nameSpace = element.Attribute("Namespace").Value;
string wqlQuery = element.Attribute("WqlQuery").Value;
if (!ValueExistsInWMI(nameSpace, wqlQuery)) {
Console.WriteLine("Install is not applicable as Applicability Rule failed: " + element.ToString());
}
}
}
}
private bool ValueExistsInRegistry(RegistryKey root, string subKeyName, string keyName, string keyValue)
{
using (RegistryKey key = root.OpenSubKey(subKeyName)) {
if (key != null) return keyValue == key.GetValue(keyName).ToString();
}
return false;
}
private bool ValueExistsInWMI(string nameSpace, string wqlQuery)
{
ManagementScope scope = new ManagementScope(String.Format("\\\\{0}\\" + nameSpace, "."), null); //The "." is for your local PC
scope.Connect();
ObjectQuery query = new ObjectQuery(wqlQuery);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
if (searcher.Get().Count == 0) {
return false;
}
else {
return true;
}
return false;
}
}
적용성 규칙을 실행하기 전에 먼저 업데이트가 운영 체제(OS) 및 서비스 팩(SP) 적용성 테스트를 통과하는지 확인하는 것이 좋습니다.업그레이드가 OS 및 SP에 적용되지 않을 경우 규칙을 통과할지 여부를 판단하기 위해 레지스트리/wmi 등을 확인하는 것은 아무런 의미가 없습니다.
적용 가능성을 보려면 다음과 같이 하십시오.정보 확장 명령줄 유틸리티를 실행합니다.
expand -f:* "C:\temp\msu\Windows6.1-KB2973201-x64.msu" "C:\temp\msu"
그러면 다음 파일이 만들어집니다.
- WSUSCAN.cab
- Windows 6.1-KB2973201-x64.cab
- Windows 6.1-KB2973201-x64.xml
- Windows 6.1-KB2973201-x64-pkgProperties.txt
xml 파일과 txt 파일을 만드는 데 약 5초가 걸립니다.pkg Properties를 엽니다.txt 파일과 맨 위 줄에는 다음 정보가 있습니다.
적용가능성정보="Windows 7.0 클라이언트 SP1, Windows 7.0 Server Core SP1, Windows 7.0 Embedded SP1, Windows 7.0 Server SP1, Windows 7.0 WinPE 3.1"
MSDN 참조: Windows Update Standalone 설치 관리자에 대한 설명
윈도우즈 Update 에이전트 API를 사용하여 설치된 업데이트(실제로는 많은 정보가 있음)를 쿼리할 수 있습니다.
// in .NET, you need to add a reference
// to the WUAPI COM component located in \windows\system32\wuapi.dll
// to be able to access the WUAPI object model
UpdateSearcher searcher = new UpdateSearcher();
searcher.Online = false; // you can remove this line if you allow the API to get online to search
var res = searcher.Search("IsInstalled=0"); // search not installed update
foreach (IUpdate update in res.Updates)
{
Console.WriteLine("update:" + update.Title);
// get history information
// this can return nothing for example it it was hidden by end user
// note we use update's identity and rev number here for matching a specific update
var histories = searcher.QueryHistory(0, searcher.GetTotalHistoryCount()).OfType<IUpdateHistoryEntry>().Where(
h => h.UpdateIdentity.UpdateID == update.Identity.UpdateID && h.UpdateIdentity.RevisionNumber == update.Identity.RevisionNumber);
foreach (var history in histories)
{
Console.WriteLine(" code:" + history.ResultCode);
Console.WriteLine(" hr:0x" + history.HResult.ToString("X8"));
}
}
그러나 업데이트가 설치되었는지 여부를 결정하는 데 사용된 내부 규칙(registry/wmi 등)은 알려주지 않습니다.이는 WUAPI에 의해 노출되지 않습니다.
언급URL : https://stackoverflow.com/questions/29843971/how-to-programmatically-check-the-applicability-rules-of-a-windows-update
'bestsource' 카테고리의 다른 글
핵심 파일을 재정의하지 않고 BACS 계정 필드에 사용자 정의 필드 추가 (0) | 2023.09.26 |
---|---|
빈 셀을 제거하는 간단한 방법 동적 드롭다운 목록 Excel (0) | 2023.09.26 |
HTML 요소의 내용이 오버플로되는지 확인 (0) | 2023.09.26 |
큰 HTML 문자열로 jQuery 개체 만들기 (0) | 2023.09.26 |
C/C++ 컴파일러는 어떻게 작동합니까? (0) | 2023.09.26 |