Team Foundation Server Administration Tool

Team Foundation Server Administration Tool es una herramienta que permite a los administradores de Team Foundation Server añadir usuarios de manera simultanea a Team Foundation Server, Sharepoint, y Sql Server Reporting Services desde una única aplicación. Tambien permite editar estos permisos.



Además Team Foundation Server Administrator Tool es un proyecto con el que podemos colaborar, además de ver el código fuente y modificarlo a nuestro gusto, puesto que esta alojado en la nueva plataforma para colaboración en proyectos promovida por Microsoft, CodePlex, de la que ya hable en este blog.


No dudeís en descargar esta útil herramienta y en visitar su sitio en Codeplex.

Acceso anónimo y autenticado simultaneo al mismo portal de Sharepoint


Suponiendo que partimos de la situación en la que unicamente tenemos acceso autenticado al portal, para configurar el acesso anónimo y autenticado simultaneo al mismo portal de Sharepoint debemos comenzar por crear un nuevo sitio de IIS, utilizando la consola de administración. Para ello deberemos establecer un puerto que no este en uso o utilizar «host headers» de manera que el sitio sea identificable de manenera única. Es importante establecer como pool de aplicaciones el mismo que utilice nuestro portal. La url de este sitio es la que utilizaremos para el acceso anónimo.



Logicamente deberemos crear una entrada en nuestro servidor DNS de manera que la url de este sitio pueda ser encontrado.



Una vez realizado los pasos preliminares anteriores en IIS y nuestro servidor DSN, empieza el trabajo en Sharepoint. Desde la consola de administración central de Sharepoint debemos extender el servidor Virtual, seleccionando Extend and Map to another virtual server y seleccionando el virtual server para el que queremos configurar el acceso anónimo.



Una vez hecho esto debemos configurar la url alternativa de acceso (esta url es la del sitio de IIS que hemos creado anteriormente). Para ello en la página de administración debemos seleccionar Configure Alternate Site Urls for Intranet, Extranet and Custom Access y proporcionar la url del sitio IIS que creamos con anterioridad.



El último paso que debemos dar dentro de Sharepoint es habilitar el acceso anónimo al portal, para ello desde la página raiz del portal (home), seleccionaremos Site Settings, Manage Security and Additional Settings y luego Change Anonymous Access Settings, habilitando desde esta página el acceso anónimo.



El paso final, es volviendo a la consola de administración de IIS, habilitar el acceso anónimo al sitio que hemos creado para proporcionar acceso anónimo.

Excelente serie de webcasts (en inglés) sobre Team System

Microsoft pone a disposición de todos nosotros una excelente serie de webcasts sobre [TS]: Power in Simplicity

Actualmnete están disponibles los siguientes títulos:

MSDN Architecture Webcast: Migrating from Visual SourceSafe to Visual Studio Team Foundation Server (Level 200)

MSDN Architecture Webcast: Test-Driven Development Using Visual Studio Team System (Level 200)

MSDN Architecture Webcast: Visual Studio 2005 Team System: Managing the Software Lifecycle (Level 200)

MSDN Architecture Webcast: Visual Studio 2005 Team System: Source and Version Control Management (Level 200)

MSDN Webcast: An Inside Look at the TFS Proxy File Cache Server (Level 200)

MSDN Webcast: An Introduction to Visual Studio Team System and the Microsoft Solutions Framework (Level 200)


MSDN Webcast: Best of Launch: Visual Studio 2005 Team Sytem (Level 200)


MSDN Webcast: Domain-Specific Language Tools for Model-Driven Development in Visual Studio 2005 (Level 200)


MSDN Webcast: Drill Down into Visual Studio Team System: Foundation Server/Third-Party Integration (Level 200)


MSDN Webcast: Drill Down into Visual Studio Team System: Team Architect Edition (Level 200)


MSDN Webcast: Drill Down into Visual Studio Team System: Team Developer Edition (Level 200)


MSDN Webcast: Drill Down into Visual Studio Team System: Team Test (Level 200)


MSDN Webcast: How and Why Process Guidance Matters in Visual Studio 2005 Team System (Level 200)


MSDN Webcast: Implementing and Customizing MSF 4.0 Process Guidance within Visual Studio 2005 Team System (Level 200)


MSDN Webcast: Increasing the Acceleration of Problem Resolution in Visual Studio Team System (Level 100)


MSDN Webcast: Introduction to Visual Studio Team System (Level 200)


MSDN Webcast: Load and Web Testing with Microsoft Visual Studio 2005 Team System (Level 200)


MSDN Webcast: Managing Requirements with Visual Studio 2005 Team Foundation Server (Level 200)


MSDN Webcast: Managing Work with Visual Studio 2005 Team System (Level 400)


MSDN Webcast: The MSDN Subscription Evolution (Level 100)


MSDN Webcast: Using Metrics from Visual Studio 2005 Team Foundation Server to Manage and Troubleshoot Your Projects (Level 200)


MSDN Webcast: Visual Studio 2005 Team System Extensibility: Overview (Level 200)


MSDN Webcast: Visual Studio 2005 Team System: Design for Operations Using AVIcode Intercept Studio and MOM 2005 (Level 100)


MSDN Webcast: Visual Studio 2005 Team System: Enterprise-Class Version Control (Level 200)


MSDN Webcast: Visual Studio Team System Extensibility: Creating and Extending System Definition Models (Level 200)


MSDN Webcast: Visual Studio Team System Extensibility: Creating Graphical Designers with Domain-Specific Language (DSL) Tools (Level 200)


MSDN Webcast: Visual Studio Team System Extensibility: For Software Developers and Testers (Level 200)


MSDN Webcast: Visual Studio Team System Extensibility: Team Foundation Server (Level 200)

El Just-In-Time Debugger…

El Just-in-time debugger básicamente es un hook, que cuando algún programa falla, por ejemplo, con una excepción no controlada o una violación de acceso a memoria, hace que el depurador que tienes instalado y regitrado en la máquina se active.


Tambien es cierto que en ocasiones puede ser un poco molesto y por tanto deseemos desactivarlo o sustituirlo por otro depurador. Para realizar cualquiera de estas dos acciones hay que modificar una clave del registro (yo que tu antes la exportaría), en concreto HKEY_LOCAL_MACHINESoftwareMicrosoftWindows
NTCurrentVersionAeDebug y su valores. Eliminado esta clave, el JIT Debugger dejara de actuar.


Todos conocemos al menos un JIT debugger, el Dr. Watson, aunque es cierto que en la ultimas versiones de Windows se le ve poco.


Otro posible depuradores que se pueden registar como JIT Debbuger son el depurador de Visual Stuido, cordbg y dbgclr (esto dos últimos diponibles con el framework de .net)


Visual Studio 2005 permite activar o desactivar el JIT debugger sin tocar el registro:
How to: Enable/Disable Just-In-Time Debugging


Una caracteristica interesante de la aplicaciones .net es que podemos indicar que cuando salte una excepción inexperada de .net, se active el JIT debugger, para ello tendremos que añadir la siguiente entrada en el archivo de configuración de la aplicación:


<configuration>
    <system.windows.forms jitDebugging=»true» />
</configuration>


Esto es especialmente útil cuando queremo depurar una aplicación en un entorno de producción. Eso si para que la aplicación sea depurarable, tendremos que o bien haberla generado en modo debug, o en modo release con pdbs (practica recomendable siempre, pues los pdb son útiles para muchas cosas, por ejemplo durante la optimización del rendimiento de aplicaciones). Decir que los pdbs serán mucho más útiles, si contamos con el código fuente asociado a ellos y al ejecutable, pues nos permitirán ir a la linea exacta donde se produjo la excepción.


Más información


INFO: Choosing the Debugger That the System Will Spawn
How to disable Dr. Watson for Windows (se aplica a cualquier depurador)


En Visual Stuido 2005 se puede hacer desde el entorno de desarrollo:
How to: Enable/Disable Just-In-Time Debugging


Más información sobre el Just-In-Time debugger de VS2005: Just-In-Time Debugging

Repositorio de fuentes online de Microsoft

Microsoft a lanzado una web que permite alojar proyectos de manera gratuita, CodePlex. Nada que no ofrezca ya a través de www.gotdotnet.com, la novedad es que este esta construido sobre [TS], por si alguien tiene alguna duda de la potencia y escalabilidad de este producto.


Podeís econtrar más información en el Wiki asociado a la proyecto de la propia web.

Hay que ser ordenado…

El otro estaba releyendo «The pragmatic programmer«, un libro muy recomendable. El caso es que en el punto que habla de la importancia para todo programador de conocer a fondo un editor de texto, ponia el ejemplo de la posiblidad de que tiene Emacs de seleccionar unas lineas de texto y ordenarlas alfabéticamente.


Yo enseguida pense en Visual Studio, y en que siempre ando ordenando a mano los import (VB) o using (C# o C++) y me dije que si Emacs tiene esto como no lo va a tener Visual Studio, pues bien el caso es que no, que no hay esa posibilidad en Visual Studio.


Pero, como no todo son van a ser malas noticias, gracias al excelente soporte para extensibilidad de Visual Studio, Nicole Calinoiu, MVP, se a currado un interesante addin llamado ImportsSorter, que es una maravilla. Incluso va más haya de simplemente ordernar por orden alfabético permitiendo definir grupos dentro de ese orden. Una pena que no este disponble el código fuente, para añadirle alguna funcionalidad.

¿Cómo se si mi proceso fue lanzado con privilegios de administrador?

Aqui va una función que permite averiguarlo:


//Comprueba que el usuario que inicio el proceso sea administrador
bool UserIsAdmin(void)
{
    bool bSuccess = false;

    //Obetenemos el token del proceso
    HANDLE hToken = NULL;
    if ( !OpenProcessToken ( GetCurrentProcess ( ), TOKEN_QUERY, &hToken ) )
        return false;


    //Obtenemos el tamaño necesarios para la información del grupos
    //asociados al token del proceso
    DWORD dwSize = 0;
    bSuccess = GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwSize) != 0;
    if( !bSuccess && ERROR_INSUFFICIENT_BUFFER != ::GetLastError() )
        return false;


    //Dimensionamos el buffer para los tokens de los grupos
    PTOKEN_GROUPS pGroups = (PTOKEN_GROUPS) new BYTE[dwSize];


    //Obtenemos la inforamción sobre los grupos
    bSuccess = GetTokenInformation ( hToken, TokenGroups,
                                                          (LPVOID)pGroups, dwSize, 
                                                          &dwSize ) != 0;


    //Cerramos el token del proceso
    CloseHandle ( hToken );


    if ( !bSuccess ) return false;


    //Obtenemos el sid de aministrador
    SID_IDENTIFIER_AUTHORITY siaNtAuth = SECURITY_NT_AUTHORITY;
    PSID pAdminSid = NULL;
    if ( !AllocateAndInitializeSid ( &siaNtAuth, 2,
                                                  SECURITY_BUILTIN_DOMAIN_RID,
                                                  DOMAIN_ALIAS_RID_ADMINS,
                                                  0,0,0,0,0,0, &pAdminSid ) )
    return false;


    bSuccess = false;

    //Comprobamos si el token de administrador esta entre los del
    //proceso, si es asi el proceso tiene privilegios de administrador
    for ( DWORD i = 0; (i < pGroups->GroupCount) && !bSuccess; i++ )
   {
       if ( EqualSid ( pAdminSid, pGroups->Groups[i].Sid ) )
             bSuccess = true;
   }


    //Liberamos el sid
    FreeSid ( pAdminSid );
    //Liberamos la memoria
   delete[] pGroups;

   return bSuccess;


}


En el mundo .Net todo es más simple, aquí va el código en C# para realizar esta misma comprobación:


using System.Security.Principal;


//Comprueba que el usuario que inicio el proceso sea administrador
bool UserIsAdmin()
{
   WindowsIdentity  identity = WindowsIdentity.GetCurrent();
   WindowsPrincipal principal = new WindowsPrincipal (identity);
   return principal.IsInRole (WindowsBuiltInRole.Administrator);
}

¿Cómo hago que mi aplicación soporte multiples idiomas?

En las aplicaciones nativas un enfoque que se utiliza bastante es el de tener una dll de recursos para cada idioma que se desea soportar. Esta dll se carga dinamicamente con LoadLibray (o AfxLoadLibray en MFC) y se establece como origen de los recursos. Para saber como crear esta dll lee Creating a Resource-Only DLL en la MSDN.

Tipicamente harás esto en InitInstace:

BOOL CMyApp::InitInstance()
{
  //Default Appwizard code.
  HINSTANCE hRes = NULL;
  hRes= LoadLibrary(«ResourceD.dll»);
  if(hRes)
    AfxSetResourceHandle(hRes);
  //Rest of wizard code
  return CWinApp::InitInstance();
}

En ATL/WTL para establecer la dll cargada como origen de los recursos se utiliza la función
CAtlBaseModule::SetResourceInstance.

Usando el API se utiliza LoadResource, LoadString etc… para cargar los recursos, pasando como primer parametro el handle de la libreria de recursosque previamente hemos cargado con LoadLibrary.


En el mundo manejado todo es un poco más sencillo, un buen punto de entrada puede ser: Resources and Localization, habla desde el punto de vista de Visual Basic, pero los conceptos se aplican a cualquier lenguaje .Net

Quieres trabajar para Microsoft desarrollando una "killer app"

Sin duda esta puede ser la ocupación soñada por la mayoria de los programadores del mundo. Microsoft está reclutando gente para desarrollar una «killer app» sobre WinFS.


La aplicación se llama «Proyecto Naranja» (Project Orange), y no se sabe mucho sobre que prentende ser, solo que será «una aplicación para que la gente organice su información, construida sobre WinFS.


Si creeís que estaís capacitados y os interesa la oferta, aquí va el link. Si no fuese por lo bien que me tratan en [PC] ya habría hechado el curriculum. Por cierto, si cumples los requisitos de Microsoft, probablemente cumplas tambien los de [PC], si es así y Seattle te parece lejos no dudes en ponerme un mail ;).


Un saludo!!!

¿Cómo puedo acceder al puerto serie/paralelo?

Tienes que usar las funciones del API de Win32 habituales para trabajar con ficheros, OpenFile, ReadFile, WriteFile, expecificando como nombre de fichero el nombre del puerto que quieres usar «LPTx» o «COMx».


Este articulo sobre el tema es muy intersante Serial Communication in Windows By Ashish Dhar


En .Net, en versiones anteriores a la 2.0, tienes que usar PInvoke para trabajar con el puerto paralelo. Un articulo que describe muy bien el proceso es: Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications


En la versión 2.0 del fremework de .Net y posteriores ya exinten clases para trabajar con las comunicaciones por el puerto serie. Un articulo sobre el tema: Serial Communication using C# and Whidbey