Прежде всего, извините за мой английский.
Мне нужно сделать исполняемый файл командной строки, который может запускаться на серверах Windows с .Net 2.0 и новее.Это мой код:
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.
И, наконец, я добавляю ссылку на deWuapiLib.dll, которая находится в C: \ Windows \ System32.
Если я скомпилирую это в Windows 10, программа пойдет нормально, но, если я выполню ее в Windows Server 2008 Standart Edition, она выдаст мнеошибка:
необработанное исключение: System.BadImageFormatException: не удалось загрузить файл или сборку «Windows-Update-Manager.exe» или одну из ее зависимостей.Эта сборка создается средой выполнения, более новой, чем текущая загруженная среда, и не может быть загружена.Имя файла: 'Windows-Update-Manager.exe'
Целевой платформой является .Net 4.0, но если я перехожу на .Net 2.0, компилятор не может загрузить ссылку на WuapiLib.dll.
Я разместил проект здесь: https://github.com/erniker/CSHARP
Я надеюсь, что кто-то может мне помочь.Спасибо !!