Sharepoint 2010 – Excepción (String was not recognized as a valid DateTime) al agregar una nueva versión en un DocumentSet

Si estas trabajando sobre Sharepoint 2010 y obtienes un bonito error (String was not recognized as a valid DateTime) al intentar, programaticamente, agregar una nueva versión con un código parecido a este:

DocumentSet.VersionCollection.Add(true, "");

Entonces es que has sido víctima de una actualización de DLL (Microsoft.Office.documentmanagement.dll) de Microsoft, concretamente a partir de la CU de Agosto 2012 el multi-idioma ya no funciona y no se pueden crear versiones de los DocumentSet.

Sigue leyendo

Como obtener el nombre del dominio de NetBios de un equipo en .NET

Para poder obtener información de netbios nos vamos a tener que meter en código de bastante bajo nivel por lo que para poder usarlo en .NET vamos a recurrir a las pinvoke

    using System.Runtime.InteropServices;
    using System.ComponentModel;

    public class NetUtil
    {
        [DllImport("netapi32.dll", CharSet = CharSet.Auto)]
        static extern int NetWkstaGetInfo(string server,
            int level,
            out IntPtr info);

        [DllImport("netapi32.dll")]
        static extern int NetApiBufferFree(IntPtr pBuf);

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        class WKSTA_INFO_100
        {
            public int wki100_platform_id;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string wki100_computername;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string wki100_langroup;
            public int wki100_ver_major;
            public int wki100_ver_minor;
        }

        public static string GetMachineNetBiosDomain()
        {
            IntPtr pBuffer = IntPtr.Zero;

            WKSTA_INFO_100 info;
            int retval = NetWkstaGetInfo(null, 100, out pBuffer);
            if (retval != 0)
                throw new Win32Exception(retval);

            info = (WKSTA_INFO_100)Marshal.PtrToStructure(pBuffer, typeof(WKSTA_INFO_100));
            string domainName = info.wki100_langroup;
            NetApiBufferFree(pBuffer);
            return domainName;
        }
    }

Tras colocar el código anterior en una clase de nuestro proyecto ya podremos obtener el dominio usando:

   NetUtil.GetMachineNetBiosDomain()

Obtener el hostname y el dominio en .NET

Obtener el hostname y el dominio usando el lenguaje .NET y más concretamente C# es sencillo, no requiere de funciones complejas ni nada por el estilo.

Obtener el hostname:

El hostname se puede obtener con tan solo una linea, «System.Environment.MachineName» nos devolverá el nombre de la máquina donde se ejecuta.

Obtener el dominio o el grupo de trabajo:

Antes de nada debemos comprobar que nuestro proyecto tiene agregadas las referencias a System.Management, en caso negativo tenemos que agregarlas. Una vez que ya tengamos las referencias bien metidas hacemos lo siguiente:

System.Management.SelectQuery query = new System.Management.SelectQuery("Win32_ComputerSystem");
System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query);
 foreach (System.Management.ManagementObject mo in searcher.Get())
 {
  string Dominio = mo["domain"] as string;
 }

En la variable Dominio ya tendremos guardado el valor que actualmente tenga la máquina donde se ejecuta.