قائمة مراوغة من تحديثات ويندوز المثبتة

هل تساءلت يومًا عن سبب إنشاء قائمة تحديثات Windows المثبتة؟ والتي من خلالها API للحصول عليه؟ سأحاول إعطاء إجابات على هذه الأسئلة وغيرها الناشئة في دراستي الصغيرة.



الخلفية أو كيف بدأ كل شيء.


يُعقد كل عام مؤتمر للمتخصصين الشباب في شركتنا ، حيث يمكن لكل مشارك حل مشكلة القسم (يتم اقتراح قائمة بالموضوعات مسبقًا). وكان لقسم SPAS (دعم البرامج والأجهزة) المهمة التالية التي أثارت اهتمامي ، بالإضافة إلى أنها أتاحت العودة إلى البرمجة مرة أخرى (لسوء الحظ ، في هذه اللحظة أعمل في هذه الشركة كمشغل بسيط لـ NPPS).

في السابق ، مقابل كل "TO" بمساعدة WSUS ، تم سحب جميع التحديثات التي تم إصدارها وتوزيعها على جميع الأجهزة. كما ظهرت TSB (نشرات الخدمات الفنية) بشكل دوري ، مما يشير إلى أنه كان مطلوبًا لتثبيت التحديثات الضرورية في شكل حزم معزولة. نتيجة لذلك ، نقوم بتجميع التحديثات التي لا يمكن تتبعها في WSUS ، ولكن لا يمكن رؤيتها إلا من خلال لوحة التحكم في قسم "التحديثات المثبتة".



مخطط التحديث البصري

هناك حالات عندما "تعطل" محطة العمل أو الخادم وعليك استعادتها من صورة تم إنشاؤها منذ بعض الوقت. عند التعافي من الصورة ، هناك احتمال أننا قد نفقد التحديثات التي نحتاجها (والتي جاءت في شكل حزم معزولة) التي تم تثبيتها قبل تعطل الجهاز. أوضح بالتفصيل قدر الإمكان ، لأن التوضيحات ستكون بالفعل سرًا تجاريًا.

لهذا السبب تم طرح الفكرة لإنشاء برنامج يمكنه استخراج قائمة التحديثات هذه (يفضل أن يكون عن بعد عبر الشبكة المحلية) ، والكتابة إلى ملف / قاعدة بيانات ، ومقارنة القائمة الحالية بنموذج معين وإرسال رسالة إلى نظام SCADA من خلال أحد البروتوكولات - SNMP ، OPC.

كما كنت قد خمنت من عنوان المقال ، كان لدي بالفعل مهمة صعبة لاختيار طريقة استرداد القائمة. كالمعتاد ، قررت البحث عن الصحيح في محرك البحث ، وطرح أسئلة حول الموارد المتخصصة ( واحد ، اثنان ، لسبب ما لم يعجب stackoverflow باللغة الإنجليزية على سؤالي وكان لا بد من حذفه) ، ولكن كل الإجابات لم تقدم النتيجة المرجوة. لذلك ، كان لا بد لي من معرفة ذلك بنفسي ، والتي سوف تناقش في وقت لاحق.

أوامر وحدة التحكم


لنبدأ بأخرى بسيطة والاستفادة مما يقدمه لنا Windows دون استخدام أدوات الجهة الخارجية. يمكن القيام بذلك باستخدام الأوامر التالية:

  • wmic قائمة qfe
  • systeminfo
  • فك / الانترنت / الحصول على حزم
  • من خلال PowerShell:

    • الحصول على الإصلاح
    • Get-SilWindowsUpdate (متوفر فقط في إصدارات الخادم)
    • Get-WmiObject -Class win32_quickfixengineering - من خلال الوصول إلى فئة WMI win32_quickfixengineering (حول WMI لاحقًا قليلاً)



يمكنك الحصول على القائمة من خلال الواجهة الرسومية من خلال العنصر القياسي في لوحة التحكم "إضافة / إزالة البرامج" ، لكن لا يمكننا نسخ أي شيء من هناك. يتم تمثيل كل أداة لوحة تحكم بملف .cpl في المجلد Windows \ System الموجود. يتم تنزيل ملفات .Cpl الموجودة في مجلد نظام Windows تلقائيًا عند بدء تشغيل لوحة التحكم. ملف Appwiz.cpl مسؤول عن عنصر البرنامج. لم تحليله لا يؤدي إلى أي شيء.

يمكن إعادة توجيه إخراج أمر وحدة التحكم إلى ملف ومن ثم يمكن تحليله ، لكن هذا خطأ ، بالإضافة إلى استدعاء البرنامج (وفقًا لقواعد SB ، لن ينجح ذلك) ولا يوجد أي شك في تلقي القائمة عن بُعد. لذلك ، أقترح عليك ببساطة استدعاء الأوامر ومقارنة عدد التحديثات في كل قائمة بالقائمة من خلال "لوحة التحكم" ومواصلة التحقيق.

بشكل رسمي ، يمكن تقسيم جميع طرق الحصول على قائمة التحديثات إلى مجموعتين: المحلية والشبكة.

الطرق المحلية والشبكة للحصول على المعلومات

تم اختبار جميع الطرق على صور النظام النظيف (Windows 7، 8، Server 2012 R2) مع التحديثات المتكاملة ، وبعد كل تحديث من خلال مركز التحديث من خوادم Microsoft الرسمية ، تم إجراء فحص إضافي. دعونا نتناول كل منهم بمزيد من التفصيل.

WUA


WUApi (واجهة برمجة تطبيقات وكيل Windows Update) - استخدام واجهة برمجة تطبيقات وكيل Windows Update. الخيار الأكثر وضوحا ، والذي يتحدث باسمه عن نفسه. سوف نستخدم مكتبة Wuapi.dll لهذا الغرض.
ملاحظة: فيما يلي ، من أجل راحتي ، سوف أدرج جميع النتائج في القائمة. قد لا يكون هذا عقلانيًا ، ولكن بعد ذلك بدا لي فكرة جيدة.
مثال التنفيذ
using WUApiLib; public static List<string> listUpdateHistory() { //WUApi List<string> result = new List<string>(200); try { UpdateSession uSession = new UpdateSession(); IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher(); uSearcher.Online = false; ISearchResult sResult = uSearcher.Search("IsInstalled=1 And IsHidden=0"); string sw = "   WUApi: " + sResult.Updates.Count; result.Add(sw); foreach (WUApiLib.IUpdate update in sResult.Updates) { result.Add(update.Title); } } catch (Exception ex) { result.Add("-   : " + ex.Message); } return result; } 


يوجد تباين ثانٍ لهذه الطريقة: تحديث الجلسة - تلقي المعلومات عن طريق الاتصال بجلسة تحديث وكيل Windows Update (في هذه الحالة ، نحن لا نعمل مباشرة مع المكتبة).

مثال التنفيذ
 public static List<string> Sessionlist(string pc) { List<string> result = new List<string>(50); //    object sess = null; object search = null; object coll = null; try { sess = Activator.CreateInstance(Type.GetTypeFromProgID("Microsoft.Update.Session", pc)); search = (sess as dynamic).CreateUpdateSearcher(); int n = (search as dynamic).GetTotalHistoryCount(); int kol = 0; //coll = (search as dynamic).QueryHistory(1, n); coll = (search as dynamic).QueryHistory(0, n); result.Add("  Update.Session: " + n); foreach (dynamic item in coll as dynamic) { if (item.Operation == 1) result.Add(item.Title); kol++; //Console.WriteLine(": " + kol); } result.Add("  : " + kol); } catch (Exception ex) { result.Add("-   : " + ex.Message); } finally { if (sess != null) Marshal.ReleaseComObject(sess); if (search != null) Marshal.ReleaseComObject(search); if (coll != null) Marshal.ReleaseComObject(coll); } return result; } 


تقترح Microsoft استخدام API عن بُعد .

العيوب الرئيسية لهاتين الطريقتين هي أنها لا تسمح لك بالعثور على إصلاحات KB التي لا يتم توزيعها من خلال Windows Update. يمكنك فقط رؤية ما مر به وكيل التحديث نفسه ، أي أن هذا الخيار لا يناسبنا.

DISM


تعتبر خدمة نشر الصور وإدارتها أداة لسطر الأوامر يمكن استخدامها لخدمة صورة Windows أو لإعداد صورة لبيئة التثبيت المسبق لـ Windows (Windows PE). إنه بديل لـ Package Manager (Pkgmgr.exe) و PEimg و Intlcfg.

يتم استخدام هذه الأداة المساعدة لدمج التحديثات ، وحزم الخدمة في صورة النظام. تحديثات Windows عبارة عن وحدات منفصلة يمكن تقديمها بعدة طرق:

  • .cab الملفات (مجلس الوزراء) - المحفوظات. مصمم للتوزيع والتثبيت باستخدام وحدات Windows Update في الوضع الآلي ؛
  • ملفات .msu (Microsoft Update Standalone Package) - الملفات القابلة للتنفيذ. مصمم للتوزيع والتثبيت من قبل المستخدمين أنفسهم في الوضع اليدوي من خلال كتالوج Microsoft Update. في الواقع ، فهي مجموعة مغلفة تتكون من ملفات .cab- و .xml و .txt.

يعرض أمر dism / online / get-package المذكور سابقًا المعلومات الأساسية حول جميع الحزم في نظام wim image / الحالي. لقد اعتنت Microsoft بنا وتوفر حزم NuGet للاستخدام السهل لواجهة برمجة التطبيقات.

مثال التنفيذ
 using Microsoft.Dism; public static List<string> DISMlist() { List<string> result = new List<string>(220); try { DismApi.Initialize(DismLogLevel.LogErrors); var dismsession = DismApi.OpenOnlineSession(); var listupdate = DismApi.GetPackages(dismsession); int ab = listupdate.Count; //Console.WriteLine("   DISM: " + ab); string sw = "   DISM: " + ab; result.Add(sw); foreach (DismPackage feature in listupdate) { result.Add(feature.PackageName); //result.Add($"[ ] {feature.PackageName}"); //result.Add($"[ ] {feature.InstallTime}"); //result.Add($"[ ] {feature.ReleaseType}"); } } catch (Exception ex) { result.Add("-   : " + ex.Message); } return result; } 


تزامن عدد التحديثات مع الرقم من قائمة لوحة التحكم حتى التحديث الأول من خلال مركز التحكم - بعد أن أصبح عدد التحديثات أقل (كان 214 ، أصبح 209) ، على الرغم من أنه كان من المنطقي أن يكون قد زاد. أمثلة الإخراج قبل التحديث ، بعد التحديث .

ما السبب وراء ذلك ، لا يمكنني إلا التكهن - ربما تكون بعض التحديثات قد حلت محل التحديثات السابقة ، وبالتالي أصبح الرقم أقل.

بعد ذلك بقليل ، صادفت أداة مساعدة من DISM ++ الصينية ، والتي لا تستند إلى واجهة برمجة تطبيقات DISM أو واجهة برمجة تطبيقات DISM ، ولكن المكتبات التي لا تملك الطرق التي أحتاج إليها مفتوحة ، لذلك تخلت عن هذه الفكرة واستمرت في البحث.

WSUS


يعد Windows Server Update Services ( WSUS ) خادمًا لتحديث أنظمة التشغيل ومنتجات Microsoft. يتزامن خادم التحديث مع موقع Microsoft على الويب ، ويقوم بتنزيل التحديثات التي يمكن توزيعها داخل الشبكة المحلية للشركات. مرة أخرى ، أداة خاصة مصممة للعمل مع التحديثات.

تم توزيعها فقط على إصدارات خادم Windows ، لذلك تم نشر الحامل التالي:

  • النظام الرئيسي هو Windows Server 2016 ؛
  • ومن خلال نظام المحاكاة الافتراضية Hyper-V ، تم نشر نظامي تشغيل عميلين:
    • ويندوز 8.1
    • ويندوز 7


جميع الأنظمة متصلة بشبكة محلية ظاهرية واحدة ، ولكن دون الوصول إلى الإنترنت .

بعض النصائح
لكي لا أقوم بتخصيص قسم قرص ثابت للنظام الجديد ، أستخدم WinNTSetup وأثبت النظام في أقراص VHD - يقوم أداة تحميل التشغيل ، بدءاً من Windows 7 (إصدارات Professional / Ultimate) ، بعمل رائع في التمهيد من صورة القرص. الأقراص التي تم الحصول عليها وبالتالي يمكن استخدامها بأمان في Hyper-V - تقتل عصفورين بحجر واحد في وقت واحد. تذكر فقط إنشاء نسخة من مستودع BCD مقدمًا من خلال الأمر bcdedit / export e: \ bcd_backup.bcd .

لا أرغب في تكوين AD لتوزيع التحديثات ، لذلك قمت ببساطة بتسجيل المسار إلى خادم WSUS في سياسات المجموعة:

إعدادات

تأكد من الانتباه إلى المنفذ ، بسبب الخطأ المطبعي (8350 بدلاً من 8530) لم أستطع تلقي التحديثات على الأجهزة العميلة ، على الرغم من أن كل شيء تم بشكل صحيح. أيضا ، أسماء العناصر في سياسات المجموعة على ويندوز 7 وويندوز 8 مختلفة.

لتلقي التقرير باستخدام WSUS ، يجب عليك تثبيت الحزمة بالإضافة إلى ذلك - سيقوم النظام بإعلامك بهذا.

والآن رمز صغير
 //      using Microsoft.UpdateServices.Administration; public static List<string> GetWSUSlist(params string[] list) { List<string> result = new List<string>(200); //    string namehost = list[0]; // ,     string = "example1"; string servername = list[1]; //  string = "WIN-E1U41FA6E55"; string Username = list[2]; string Password = list[3]; try { ComputerTargetScope scope = new ComputerTargetScope(); IUpdateServer server = AdminProxy.GetUpdateServer(servername, false, 8530); ComputerTargetCollection targets = server.GetComputerTargets(scope); // Search targets = server.SearchComputerTargets(namehost); // To get only on server FindTarget method IComputerTarget target = FindTarget(targets, namehost); result.Add(" : " + target.FullDomainName); IUpdateSummary summary = target.GetUpdateInstallationSummary(); UpdateScope _updateScope = new UpdateScope(); // See in UpdateInstallationStates all other properties criteria //_updateScope.IncludedInstallationStates = UpdateInstallationStates.Downloaded; UpdateInstallationInfoCollection updatesInfo = target.GetUpdateInstallationInfoPerUpdate(_updateScope); int updateCount = updatesInfo.Count; result.Add(" -   - " + updateCount); foreach (IUpdateInstallationInfo updateInfo in updatesInfo) { result.Add(updateInfo.GetUpdate().Title); } } catch (Exception ex) { result.Add("-   : " + ex.Message); } return result; } public static IComputerTarget FindTarget(ComputerTargetCollection coll, string computername) { foreach (IComputerTarget target in coll) { if (target.FullDomainName.Contains(computername.ToLower())) return target; } return null; } 


نظرًا لعدم وجود الإنترنت ، يظهر الموقف مع التحديثات كما في لقطة الشاشة أدناه:



يشبه السلوك WUApi - إذا لم تمر التحديثات من خلالهم ، فإنهم لا يعرفون ذلك. لذلك ، هذه الطريقة لا تعمل مرة أخرى.

WMI


Windows Management Instrumentation ( WMI ) في الترجمة الحرفية عبارة عن مجموعة أدوات لإدارة Windows.

WMI هو أحد المعايير التي تطبقها Microsoft لإدارة مؤسسة عبر الإنترنت للإدارة المركزية ومراقبة أجزاء مختلفة من بنية أساسية للكمبيوتر تعمل على نظام Windows الأساسي. WMI هو نظام موحد مفتوح لواجهات الوصول لأي معلمات من نظام التشغيل والأجهزة والتطبيقات التي تعمل فيه.

تسمح لك هذه الطريقة بتلقي البيانات من الجهاز المحلي وكذلك عن بعد داخل الشبكة المحلية. للوصول إلى كائنات WMI ، يتم استخدام لغة استعلام WMI (WQL) محددة ، والتي تعد واحدة من أنواع SQL. سوف نتلقى القائمة من خلال فئة WMI win32_quickfixengineering .

مثال التنفيذ
 using System.Management; public static List<string> GetWMIlist(params string[] list) { List<string> result = new List<string>(200); //    ManagementScope Scope; string ComputerName = list[0]; string Username = list[1]; string Password = list[2]; int kol = 0; if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) { //    ,      //  . ConnectionOptions Conn = new ConnectionOptions(); Conn.Username = Username; Conn.Password = Password; //      «NTLMDOMAIN:»  NTLM  ,       NTLM. Conn.Authority = "ntlmdomain:DOMAIN"; Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn); } else Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null); try { Scope.Connect(); ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_QuickFixEngineering"); ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query); foreach (ManagementObject WmiObject in Searcher.Get()) { result.Add(WmiObject["HotFixID"].ToString()); //Console.WriteLine("{0,-35} {1,-40}", "HotFixID", WmiObject["HotFixID"]);// String //result.Add(); /*result.Add("{0,-17} {1}", " : ", WmiObject["Description"]); result.Add("{0,-17} {1}", ": ", WmiObject["Caption"]); result.Add("{0,-17} {1}", " : ", WmiObject["InstalledOn"]);*/ kol++; } result.Add("  " + kol); } catch (Exception ex) { result.Add("-   : " + ex.Message); } return result; } 


من الناحية الكمية ، يتزامن كل شيء (حتى بعد التحديثات) ، لذلك تقرر استخدام هذه الطريقة. لإنشاء طلبات WMI بطريقة برمجية ، أنصحك باستخدام الأداة التالية - WMI Delphi Code Creator . بفضلها ، نظرت إلى الكود الخاص بي بطريقة مختلفة قليلاً وقررت استخدام فارغة من هذا البرنامج.

XML


البيانات التي تم الحصول عليها بواسطة طريقة WMI لم تمنعني ، وقررت "هندسة عكس السطح". سنستخدم الأداة المساعدة Process Monitor من مجموعة برامج Sysinternals Suite لتحديد الملفات وفروع التسجيل التي يتم استخدامها عند استدعاء أوامر وحدة التحكم المذكورة أعلاه والوصول إلى عنصر "التحديثات المثبتة" من خلال لوحة التحكم.

تم لفت انتباهي إلى ملف wuindex.xml الموجود في المجلد C: \ Windows \ servicing \ Packages \. لتحليله ، تم كتابة البرنامج التالي:

مثال على تطبيق وحدة التحكم
 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using System.Text.RegularExpressions; using System.IO; namespace XMLviewer { class Program { static void Main(string[] args) { string writePath = AppDomain.CurrentDomain.BaseDirectory + "XML  " + Environment.MachineName + ".txt"; if (!File.Exists(writePath)) { Console.WriteLine("  txt "); } else { Console.WriteLine(" XML .txt ,   "); File.Delete(writePath); } //      KB Regex regex = new Regex(@"KB[0-9]{6,7}"); //Regex(@"(\w{2}\d{6,7}) ?"); //SortedSet    ,     ""     SortedSet<string> spisok = new SortedSet<string>(); XmlDocument xDoc = new XmlDocument(); string path = "C:\\Windows\\servicing\\Packages\\wuindex.xml"; //   xml xDoc.Load(path); int kol = 0; //-  int total = 0; //-    xml int total2 = 0; //-   XmlNodeList name = xDoc.GetElementsByTagName("Mappings"); foreach (XmlNode xnode in name) { //Console.WriteLine(xnode.Name); kol++; XmlNode attr = xnode.Attributes.GetNamedItem("UpdateId"); //Console.WriteLine(attr.Value); foreach (XmlNode childnode in xnode.ChildNodes) { XmlNode childattr = childnode.Attributes.GetNamedItem("Package"); total++; //Console.WriteLine(childattr.Value); MatchCollection matches = regex.Matches(childattr.Value); if (matches.Count > 0) { foreach (Match match in matches) //Console.WriteLine(match.Value); spisok.Add(match.Value); } else { //Console.WriteLine("  "); } } } try { StreamWriter sw = new StreamWriter(writePath); foreach (string element in spisok) { //Console.WriteLine(element); sw.WriteLine(element); total2++; } sw.Close(); } catch (Exception ex) { Console.WriteLine(": " + ex.Message); } //Console.WriteLine("\n"); Console.WriteLine(" : " +kol); Console.WriteLine("    xml: " + total); Console.WriteLine(" KB : " + total2); Console.WriteLine("    ."); Console.Read(); } } } 


لسوء الحظ ، لم يتم العثور على هذا الملف على جميع الأنظمة ، ومبدأ إنشاء وتحديثه ظل لغزا بالنسبة لي. لذلك ، مرة أخرى هذه الطريقة لا تناسبنا.

CBS


هنا نأتي إلى ما ترتبط كل هذه الأساليب مع. مواصلة تحليل سجلات مراقب العملية ، وحددت المجلدات والملفات التالية.

ملف DataStore.edb الموجود في المجلد C: \ Windows \ SoftwareDistribution \ DataStore . هذه قاعدة بيانات تحتوي على محفوظات كافة التحديثات للإصدار المثبت من Windows ، بما في ذلك التحديثات التي يتم وضعها في قائمة الانتظار فقط.

تم استخدام برنامج ESEDatabaseView لتحليل ملف DataStore.edb. يوجد جدول tbUpdates في قاعدة البيانات ، يصعب تفسير محتوياته.

الجدول TbUpdates في ESEDatabaseView

بعد لفت انتباهي إلى عملية TiWorker.exe ، والتي كانت تسمى في كل مرة أقوم فيها بفتح عنصر في لوحة التحكم. "سار" عبر العديد من المجلدات ، قادني أحدها إلى المسار الصحيح.

C: \ Windows \ SoftwareDistribution هو مجلد يستخدمه Windows Update لتنزيل التحديثات على جهاز كمبيوتر وتثبيتها ، كما أنه يخزن معلومات حول كافة التحديثات المثبتة مسبقًا.

مجلد WinSxS الموجود في C: \ Windows \ winsxs . هذا هو مجلد الخدمة لنظام التشغيل Windows المستخدم لتخزين الإصدارات المثبتة مسبقًا من مكونات النظام. نظرًا لوجودها ، يمكن الرجوع إلى إصدار قديم من التحديث إذا لزم الأمر.

C: \ Windows \ servicing - هو المكون الرئيسي للنظام بأكمله ، واسمه هو Serviced-Based Servicing (CBS) .

CBS هي خدمة قائمة على المكونات وتشكل جزءًا من Windows ومتكاملة مع خدمة Windows Update. على النقيض من خدمة الخدمة المستندة إلى الملفات (FBS) (لأنظمة التشغيل السابقة لنظام التشغيل Windows Vista) ، حيث تم تحديث الملفات مباشرة في دلائل النظام ، قدمت CBS تسلسل هرمي كامل من الدلائل ومجموعة كاملة من وحدات / مكتبات الخدمة.

CbsApi.dll هي مكتبة دعم تقنية CBS الرئيسية. لا يوجد لديه طرق مفتوحة ، لذلك لا يمكنني استخدامها مباشرة. تستخدم Microsoft TrustedInstaller.exe و TiWorker.exe للوصول إلى أساليب هذه المكتبة وبالفعل من خلال هذه العمليات تعرض البيانات التي نحتاجها. يتم الاحتفاظ بالسجلات في C: \ Windows \ Logs \ CBS \ CBS.log .

في وقت إنشاء النموذج الأولي للبرنامج (يمكنك رؤية مايو 2019 في لقطات الشاشة) ، لم تكن هناك معلومات باللغة الروسية حول CBS ، ولكن في نهاية أغسطس ، كان هناك مقال جيد جدًا على المدونة - http://datadump.ru/component-based-servicing . مقال مثير جدا للاهتمام أكد تجربتي وجمع المعلومات الضرورية. والمزيد حول هذا الموضوع: http://www.outsidethebox.ms/17988/

استنتاج


قامت Microsoft بتعقيد المهمة التافهة المتمثلة في الحصول على قائمة بالتحديثات وجعل هذه العملية غير واضحة تمامًا. كل هذا يتم للسلامة ، ولكن ليس لسهولة الاستخدام. وأنا أتفق مع مؤلف المقال - بدأت القدرة على التنبؤ والشفافية غائبة في تلقي التحديثات.

كنتيجة للدراسة ، تمت كتابة البرنامج التالي ، يمكن مشاهدة عرض توضيحي في هذا الفيديو:


خطط لإضافة:

  1. مقارنة قائمة التحديثات الضرورية مع المستلمة ؛
  2. إرسال النتيجة عبر SNMP / OPC (إذا كان لدى أي شخص خبرة ، شارك في التعليقات) ؛
  3. تنظيم تثبيت التحديثات "غير المتصلة" المفقودة من المجلد المحدد.

إذا كنت تعرف المزيد من الطرق للحصول على قائمة بالتحديثات ، ليس فقط ، ولكن أيضًا المكونات الإضافية (Adobe Flash ، Acrobat Reader ، وما إلى ذلك) أو لديك اقتراحات أخرى مثيرة للاهتمام ، فاكتب عنها في التعليقات أو في الرسائل الخاصة - سيسعدني تلقي أي ملاحظات . وشارك في الاستبيان الخاص بهذا المقال - لذا سأعرف ما إذا كانت تجربتي مع جمهور هبرا هابر ستكون مثيرة للاهتمام.

Source: https://habr.com/ru/post/ar467445/


All Articles