Páginas

2009/11/20

Sacar un XSD desde un XML

Pasar sacar un esquema inferido desde un archivo XML en .NET (C#), podemos hacer lo siguiente:

(Aplicación de consola)

XmlReader _reader = XmlReader.Create(_pathFicheroXML);
XmlSchemaSet _schemaSet = new XmlSchemaSet();
XmlSchemaInference _schema = new XmlSchemaInference();
_schemaSet = _schema.InferSchema(_reader);
foreach (XmlSchema _schemaObj in _schemaSet.Schemas())
{
  _schemaObj.Write(Console.Out);
}

2009/11/18

El problema de mostrar los certificados del almacén CertificateAuthority

Si alguna vez habéis intentado sacar los certificados por almacén, es posible que hayáis tenido problemas al mostrar el almacén CertificateAuthority en concreto.

Para sacar el listado de certificados yo hacía lo siguiente:

private Array listaDeAlmacenes()
{
    return Enum.GetNames(typeof(StoreName));
}

private IList certificadosPorAlmacen(string almacen)
{

        IList listaCertf = new List();

        try
        {
            X509Store store = new X509Store(almacen, StoreLocation.CurrentUser);

            store.Open(OpenFlags.ReadOnly);

            X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;

            foreach (X509Certificate2 certificado in collection)
            {

        ….. (etc)
   

listadeAlmacenes() devuelve en este caso, un array de strings de 8 elementos:


[0]: "AddressBook"
[1]: "AuthRoot"
[2]: "CertificateAuthority"
[3]: "Disallowed"
[4]: "My"
[5]: "Root"
[6]: "TrustedPeople"
[7]: "TrustedPublisher"


Cada una de estas cadenas se pasan al método certificadosPorAlmacén() y todo funciona bien exceptuando el caso de CertificateAuthority que no devolvía nada.

La solución la encontré rascando por internet y concretamente en: http://www.koders.com/csharp/fid7DCF8CE37E137FCC9549AD6DC0FCB4BEA690F50F.aspx

Este enlace nos lleva a la clase Mono.Security.X509 donde podemos ver el desarrollo que se ha hecho de la clase similar de Microsoft.

Me llamó la atención este método:

private static string StoreNameToString (StoreName sn)
        {
            switch (sn) {
                case StoreName.CertificateAuthority:
                    return "CA";
                default:
                    return sn.ToString ();
            }
        }

Pues bien, aquí está la solución: solamente hace falta cambiar el nombre de "CertificateAuthority" a "CA" para que funcione.

 
Sabiendo esto, cambié mi método de la siguiente forma:


private List listaDeAlmacenes()
    {
       
        List lista=new List();

        foreach (string sn in Enum.GetNames(typeof(StoreName)))
        {
            lista.Add(sn);
        }

        //Aquí se realiza el cambio
        lista[Array.IndexOf(lista.ToArray(), "CertificateAuthority")] = "CA";


        /* También valdría:
         *
        lista = Enumerable.Union(
            lista.Where(p => p != "CertificateAuthority"),
            Enumerable.Repeat("CA", 1)).
            ToList();
        */

        /* Y también:
        if (lista.Contains("CertificateAuthority"))
        {
            lista.Remove("CertificateAuthority");
            lista.Add("CA");
        }
        */

        return lista;
    }

MsiInv o cómo obtener información del software instalado en tu ordenador (en Windows)

Pues como dice el título, si quieres saber realmente qué software tienes instalado en tu computadora con el sistema operativo Windows, recom...