使用WuapiLib

时间:2019-01-22 19:43:32

标签: c# windows server .net-framework-version

首先,对不起我的英语。

我需要使命令行可执行文件可以在具有.Net 2.0和最新版本的Windows服务器中运行。 这是我的代码:

sing System;
using WUApiLib;
using System.IO;
using CommandLineParser.Arguments;
using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using TheArtOfDev.HtmlRenderer.PdfSharp;

namespace Windows_Update_Manager
{
    class Program
    {
        //Funcion que busca las actualizciones pendientes
        static public string[] Get_Updates()
        {
            try
            {
                UpdateSession uSession = new UpdateSession();
                IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher();
                ISearchResult uResult = uSearcher.Search("IsInstalled=0 and Type='Software'");

                //Console.WriteLine("check");

                if (uResult.Updates.Count <= 1)
                {
                    Console.WriteLine("No hay actualizaciones pendientes.");
                    string[] list = {"No hay actualizaciones pendientes."};
                    return list;
                }
                else if (uResult.Updates.Count > 1)
                {
                    //Console.WriteLine("checkuno");


                    foreach (IUpdate update in uResult.Updates)
                    {
                        string KBstring = update.Title.ToString();
                        string KB = (KBstring.Substring((KBstring.Length -11), 11)).Replace("(","").Replace(")","");
                        Console.WriteLine(update.LastDeploymentChangeTime + " " + update.Title + " " + KB + " " + update.MaxDownloadSize);
                    }
                    //Creamos un array con la lista de actualizaciones
                    string[] list = new string[uResult.Updates.Count];
                    for (int i = 0; i < uResult.Updates.Count; i++)
                    {
                        string KBstring = uResult.Updates[i].Title.ToString();
                        string KB = (KBstring.Substring((KBstring.Length - 11), 11)).Replace("(", "").Replace(")", "");

                        list[i] = ( uResult.Updates[i].LastDeploymentChangeTime.ToString() +"|"+ uResult.Updates[i].Title.ToString() +"|" + KB + "|"+ (Math.Round((uResult.Updates[i].MaxDownloadSize / 1024 / 1024), 2)).ToString() );
                    } // end for
                    return list;
                }
                else
                {
                    //string[,] list = { { "Error desconocido" }, {""} };
                    string[] list = {"Error desconocido" };
                    return list;
                }
            }
            catch (Exception e)
            {
                //string[,] list = { {e.ToString() }, {" "} };
                string[] list = {e.ToString()};
                //Si ocurre algún error, lo imprimimos 
                Console.WriteLine("Exception", e);
                return list;
            }
        }

        //Funcion que solo descarga las actualizciones pendientes
        static public void Download_Updates()
        {
            try
            {
                UpdateSession uSession = new UpdateSession();
                IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher();
                ISearchResult uResult = uSearcher.Search("IsInstalled=0 and Type='Software'");

                //Console.WriteLine("check");

                if (uResult.Updates.Count < 1)
                {
                    Console.WriteLine("No hay actualizaciones pendientes.");
                }
                else if (uResult.Updates.Count > 1)
                {
                    //Console.WriteLine("checkuno");
                    foreach (IUpdate update in uResult.Updates)
                    {
                        Console.WriteLine(update.Title);
                    }

                    Console.WriteLine("Descargando actualizaciones...");

                    UpdateDownloader downloader = uSession.CreateUpdateDownloader();
                    //Console.WriteLine("line");
                    downloader.Updates = uResult.Updates;
                    //Console.WriteLine("line2");
                    downloader.Download();
                    //Console.WriteLine("line3");

                    Console.WriteLine("Actualizaciones descargadas.");
                }
            }
            catch (Exception e)
            {
                //Si ocurre algún error, lo imprimimos 
                Console.WriteLine("Exception", e);
            }
        }

        //Funcion que instala las atulaizciones pendientes
        static public void Install_Updates()
        {
            try
            {
                UpdateSession uSession = new UpdateSession();
                IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher();
                ISearchResult uResult = uSearcher.Search("IsInstalled=0 and Type='Software'");

                //Console.WriteLine("check");

                if (uResult.Updates.Count < 1)
                {
                    Console.WriteLine("No hay actualizaciones pendientes.");
                }
                else if (uResult.Updates.Count > 1)
                {
                    //Console.WriteLine("checkuno");
                    foreach (IUpdate update in uResult.Updates)
                    {
                        Console.WriteLine(update.Title);
                    }

                    Console.WriteLine("Descargando actualizaciones...");

                    UpdateDownloader downloader = uSession.CreateUpdateDownloader();
                    //Console.WriteLine("line");
                    downloader.Updates = uResult.Updates;
                    //Console.WriteLine("line2");
                    downloader.Download();
                    //Console.WriteLine("line3");

                    Console.WriteLine("Actualizaciones descargadas.");

                    Console.WriteLine("Actualizando Colecciones...");
                    UpdateCollection updatesToInstall = new UpdateCollection();
                    foreach (IUpdate update in uResult.Updates)
                    {
                        if (update.IsDownloaded) updatesToInstall.Add(update);
                    }

                    Console.WriteLine("Instalar actualizaciones recogidas...");
                    IUpdateInstaller installer = uSession.CreateUpdateInstaller();
                    //Console.WriteLine("Check1");
                    installer.Updates = updatesToInstall;
                    //Console.WriteLine("Check2");

                    IInstallationResult installationRes = installer.Install();
                    //Console.WriteLine("Check3");
                    for (int i = 0; i < updatesToInstall.Count; i++)
                    {
                        //Console.WriteLine("Check4");
                        if (installationRes.GetUpdateResult(i).HResult == 0)
                        {
                            //Console.WriteLine("Check5");
                            Console.WriteLine("Instalada : " + updatesToInstall[i].Title);
                        }
                        else
                        {
                            Console.WriteLine("Instalación Fallida : " + updatesToInstall[i].Title);
                        }

                        Console.Write("pause");
                    }
                }
            }
            catch (Exception e)
            {
                //Si ocurre algún error, lo imprimimos 
                Console.WriteLine("Exception", e);
            }
        }

        //Función para crear Excel con lista de actualiaciones
        static public void Generate_PDF(string[] list, string Path)
        {
            string lista = "<tr>" + "<td> Date </td>" + "<td> Title </td>" + "<td> KBId </td>" + "<td> Size (MB) </td>" + "</tr>";
            //Hacemos Split
            int i = 2;
            foreach (string upd in list)
            {
                lista = lista + "<tr>";
                string[] celdas = upd.Split('|');
                int j = 1;
                foreach (string celda in celdas)
                {
                    lista = lista + "<td>" + celda + "</td>";
                    j++;
                }
                lista = lista + "</tr>";
                i++;
            }

            //Guardamos el documento
            string filename = Path.Replace("\\", "\\\\");

            //Creamos un nuevo documento PDF
            //PdfDocument document = new PdfDocument();
            //document.Info.Title = "Created with PDFsharp";

            //Creamos una página vacía
            //PdfPage page = document.AddPage();

            //Generamos un objeto XGraphics para dibujar
            //XGraphics gfx = XGraphics.FromPdfPage(page);

            //Creamos la fuente
            //XFont font = new XFont("Verdana", 20, XFontStyle.BoldItalic);

            //Dibujamos el texto
            //gfx.DrawString(lista, font, XBrushes.Black,
            //new XRect(0, 0, page.Width, page.Height),
            //XStringFormats.Center);

            PdfDocument  document = PdfGenerator.GeneratePdf("<html><table class= 'egt'>" + lista+ "</table></html>", PageSize.A4);
            document.Save(filename);
            //PdfDocument document = PdfGenerator.GeneratePdf("<p><h1>Hello World</h1>This is html rendered text</p>", PageSize.A4);
            //document.Save("D:\\File.pdf");

            //document.Save(filename);
        }

        //FUNCION PRINCIPAL
        static void Main(string[] args)
        {
            //Creamos los argumentos de línea de comandos
            CommandLineParser.CommandLineParser parser = new CommandLineParser.CommandLineParser();
            ValueArgument<string> Opciones = new ValueArgument<string>('o', "opciones", "GetUpdates, Download or Install");
            ValueArgument<string> Path = new ValueArgument<string>('p', "Path", "Ruta Excel con lista actulizaciones");
            parser.Arguments.Add(Opciones);
            parser.Arguments.Add(Path);
            parser.ParseCommandLine(args);
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("INDRA SOLUCIONES TI - WINTEL - Actualizaciones pendientes");
            Console.WriteLine("Seleccion: " + Opciones.Value);
            if (Opciones.Value == "GetUpdates")
            {
                Console.WriteLine("Ruta seleccionada: " + Path.Value);
            }
            try //recorremos uno a uno los parámetros obtenidos al ejecutar el programa
            {
                //preguntamos si corrimos el programa con el atributo o argumento -Getupdates
                if (Opciones.Value == "GetUpdates")
                {
                    Console.WriteLine("Listado de actualizaciones pendientes...");
                    string[] list = Get_Updates();
                    Generate_PDF(list, Path.Value);
                    //Generate_PDF(list, @"C:\Users\jpmedinag\Desktop\Desarrollos C#\Windows-Update-Manager Net (PDF)\Windows-Update-Manager\bin\Release\test.pdf");
                }
                //preguntamos si corrimos el programa con el atributo o argumento -descargar
                else if (Opciones.Value == "Download")
                {
                    Console.WriteLine("Descargando actulaizaciones...");
                    Download_Updates();
                }
                //preguntamos si corrimos el programa con el atributo o argumento -instalar
                else if (Opciones.Value == "Install")
                {
                    Console.WriteLine("Instalando actualizaciones...");
                    Install_Updates();
                }
                else
                {
                    throw new System.InvalidOperationException("ERROR: Parámetros incorrectos. GetUpdates: para obtener una lista en XLSX, Download: para descargar las actualizaciones, Install: para descargar e instalar las actualizaciones");
                }
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(ex);
                Console.ForegroundColor = ConsoleColor.White;
                Environment.Exit(2);
            }
        }
    }
}

我使用NuGet的:CommandLineArgumentsParser,LinqBridge,PDFsharp,HtmlRenderer.PdfSharp和HtmlRenderer.Core。

最后,我添加一个对de WuapiLib.dll的引用,该引用位于C:\ Windows \ System32中。

如果我在Windows 10中编译此程序,则程序运行良好,但是,如果我在Windows Server 2008 Standar版中执行此程序,则会抛出错误:

未处理的异常:System.BadImageFormatException:无法加载文件或资产 mbly'Windows-Update-Manager.exe'或其依赖项之一。这个大会是b 由比当前加载的运行时新的运行时启动,无法加载。 文件名:“ Windows-Update-Manager.exe”

目标平台是.Net 4.0,但是如果我更改为.Net 2.0,则编译器无法加载引用WuapiLib.dll。

我将项目放在这里: https://github.com/erniker/CSHARP

我希望有人能帮助我。谢谢!

0 个答案:

没有答案