Visual Studio 201X + Fall Creators Update

Lo que a priori puede parecer alarmante, en equipos de desarrollo con Visual Studio instalado, después de instalar la actualización para Windows 10 Fall Creators Update:

[ArgumentOutOfRangeException: El argumento especificado está fuera del intervalo de valores válidos.
Nombre del parámetro: site]
   System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags, PolicyLevel policyLevel, Exception appDomainCreationException) +280

 

Se soluciona sencillamente volviendo a instalar IIS desde el Panel de control\Programas\Programas y características en «Activar o desactivar las características de Windows»

 

Podremos volver a depurar proyectos web en tiempo real sin necesidades de reiniciar. Por algún motivo desconocido durante el proceso se desactiva.

 

Sintaxis en servicios WCF asíncronos

A la hora de generar servicios escalables que aprovechen el procesamiento en paralelo algunos detalles sintácticos deben realizarse literalmente. La nomenclatura puede perderse por el camino generando errores en el momento de ejecutar los servicios:

Your begin method must take an AsyncCallback and an object as the last two arguments and return an IAsyncResult.

Signatura no válida del método Begin asincrónico para el método miFuncionAsyncIniciar en el tipo de XXXX. El método Begin debe tomar AsyncCallback y un objeto como los dos últimos argumentos y devolver IAsyncResult

 

El procedimiento debe tener asociadas la tareas iniciando con el nombre Begin con los dos últimos parámetros AsynCallBack y object:

 

public interface IEjemplo
{

    [OperationContractAttribute]
    string MiFuncion(string mensaje, int otroParametro);

    [OperationContractAttribute(AsyncPattern = true)]
    IAsyncResult BeginMiFuncion(string mensaje, int otroParametro, AsyncCallback callback, object asyncState);

    //No se especifica OperationContractAttribute para el método de finalización.
    string EndMiFuncion(IAsyncResult result);

}

La documentación esta clara pero la traducción puede generar confusión con un sencillo erros de sintaxis obligatoria. 

 

How to: Implement an Asynchronous Service Operation

Sessions, Instancing, and Concurrency

 

Ejemplo completo de una excepción tipo:

 

System.InvalidOperationException: Signatura no válida del método Begin asincrónico para el método UnirAsyncIniciar en el tipo de ServiceContract XXXXXX. El método Begin debe tomar AsyncCallback y un objeto como los dos últimos argumentos y devolver IAsyncResult.
   en System.ServiceModel.Description.ServiceReflector.IsBegin(OperationContractAttribute opSettings, MethodInfo method)
   en System.ServiceModel.Description.TypeLoader.CreateOperationDescription(ContractDescription contractDescription, MethodInfo methodInfo, MessageDirection direction, ContractReflectionInfo reflectionInfo, ContractDescription declaringContract)
   en System.ServiceModel.Description.TypeLoader.CreateOperationDescriptions(ContractDescription contractDescription, ContractReflectionInfo reflectionInfo, Type contractToGetMethodsFrom, ContractDescription declaringContract, MessageDirection direction)
   en System.ServiceModel.Description.TypeLoader.CreateContractDescription(ServiceContractAttribute contractAttr, Type contractType, Type serviceType, ContractReflectionInfo& reflectionInfo, Object serviceImplementation)
   en System.ServiceModel.Description.TypeLoader.LoadContractDescriptionHelper(Type contractType, Type serviceType, Object serviceImplementation)
   en System.ServiceModel.Description.ContractDescription.GetContract(Type contractType, Type serviceType)
   en System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2& implementedContracts)
   en System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses)
   en System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses)
   en Microsoft.Tools.SvcHost.ServiceHostHelper.CreateServiceHost(Type type, ServiceKind kind)
   en Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)

 

 

 

Seudonimización y anonimización de datos personales en la RGPD

La utilización de técnicas de encriptación, índices alternativos y otros elementos de seguridad no garantizan la anonimización de datos mientras sea posible acceder a la misma información atravesando un camino más complejo, pese a ello permitiendo identificar indirectamente a la misma persona física o conjunto de datos.

Ninguna técnica de anonimización carece de deficiencias, aunque algunas de ellas permiten disociar la información suficiente como para no poner en peligro la privacidad suponen la alteración inherente de las fuentes.

En ciertos escenarios, con grandes valores de una muestra sería posible de manera eficiente suprimir los datos no relevantes identificativos de un individuo. Por ejemplo, la estadística de afección de una enfermedad cardiológica en una región no necesita mostrar el nombre del paciente.

Además de la eliminación de datos no relevantes, también es posible realizar su generalización. Por ejemplo, sustituimos la edad por un rango o la localidad por un código postal más amplio.

Estas técnicas de anonimización denominadas generalmente k-anonymity han ido evolucionando, introduciendo mejoras para evitar revertir el anonimato centrados en dos posibles factores:

  • La homogeneidad de la muestra, es decir, un valor sensible dentro de un conjunto determinado de registros en los que los valores son idénticos. Por ejemplo, el 99% de la muestra de pacientes obtenida en la micronesia no contiene haplogrupo de tipo M, con lo que sería más sencillo identificar ese 1% restante de origen indio.
  • Conocimientos genéricos, por ejemplo, conociendo un rango determinado de edad en la que los accidentes de tráfico son más frecuentes es posible extraer un grupo de datos reducido con ciertas características.

Al igual que sucede con los cifrados, el esfuerzo de tiempo/dinero debe ser lo suficientemente alto para que su realización no salga a cuenta por parte del atacante. El análisis de riesgos y la adopción de buenas prácticas, protocolos, formación del personal… definen la intención y diligencia del responsable del fichero.

Pese a todo ello, la identificación indirecta sigue siendo un riesgo difícil de abordar o proteger. Si varias empresas disponen de datos anonimizados independientemente, sería posible cruzarlos para llegar a identificar a una persona concreta. Por ejemplo, datos de movimientos de un banco, resultados médicos de una revisión, pólizas de seguros contratadas, datos demográficos de una localidad…

Tal vez ahora se vea más claro el valor y poder de la información que manejan algunas empresas nacidas de internet como Google, Linkedin, PayPal o Facebook por poner nombres a las bases de datos.

Deben analizarse los peligros de reidentificación según los objetivos y finalidad de la información anonimizada, teniendo claro el umbral de riesgo aceptable.

Una vez repasadas alguna de los conceptos de anonimización, podemos entrar en lo que los perfiles jurídicos denominan seudonimización: sustitución de un atributo (normalmente único) por otro en un registro; dentro de un perfil técnico que haya ideado una base de datos relacional lo denominaría: clave primaria, con su ejemplo más sencillo de utilizar un DNI como tal, un valor autonumérico o un GUID.

Si bien estas técnicas vienen aplicándose en cualquier base de datos relacional, las recomendaciones sugieren (si no se ha hecho todavía) la adición de una capa adicional de seguridad a los datos, a las claves u a ambos, de cifrado con clave secreta. Si además añadimos un valor aleatorio (salt) y funciones hash de cálculo para su comprobación, el coste efectivo frente a un ataque se incrementa.

Teniendo en cuenta el almacenamiento que suele realizarse de las claves y contraseñas, sería aconsejable utilizar técnicas adicionales mixtas. Por ejemplo, si en lugar de basarnos solo en las contraseñas utilizamos datos biométricos en un canal seguro, es decir, una lectura de iris, un patrón de voz o una huella dactilar es otro dato binario más al que podemos aplicar un hash determinado, pero si el canal de obtención es único y seguro podemos combinarlo con una autenticación doble, poniendo las cosas más difíciles en caso de intentos de acceso no autorizados a la información.

 

 

Actualizar TFS 2015 Update 4 en sistemas no ingleses

En ocasiones actualizar las versiones de Team Foundation Server en instalaciones locales necesita de una preparación adicional, si no hubo planificación anterior o las condiciones de infraestructuras no son las idóneas. Entre ellas, existe la limitación de idiomas, en las que debemos de tener en cuenta si nuestros servidores de base de datos SQL Server no están en inglés, debemos tener instalado el paquete de idioma correspondiente, por ejemplo Inglés y Español en el sistema donde reside TFS.

Al intentar instalar nos aparecerá el mensaje siguiente:

En el registro de la instalación aparece:

[0C18:0CD8][2014-00-00T13:33:25]i000: MUX:  Stop Block: Dev14_LanguageInstall : La versión de Team Foundation Server instalada actualmente está en otro idioma. Solo puede haber un idioma de Team Foundation Server instalado.

No se trata solo de añadirlo al sistema operativo, deben estar instalados los paquetes de idiomas (Control Panel -> Clock, Language and Region -> Language, dentro de cada idioma desde Options pulsamos sobre Download and install language pack

 

 Una vez instalado el idioma (si no lo estaba) debe ser el principal del sistema operativo, reiniciar el equipo y ya será posible instalar la actualización. Deben coincidir Formato, Ubicación e Idioma

Error 0x800f0831 añadiendo roles

Error 0x800f0831 añadiendo roles

Al intentar añadir cualquier rol nuevo, siempre aparece este error. Las reparaciones con SFC / DISM online y local muestran errores o no sirven:

dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase
dism.exe /online /Cleanup-Image /RestoreHealth /Source:wim:X:\sources\install.wim:1 /LimitAccess
dism.exe /online /cleanup-image /restorehealth

Revisando el registro %WinDir%\Logs\CBS\CBS.log nos encontramos errores con los paquetes de idioma preinstalados STATUS_SXS_ASSEMBLY_MISSING…

Leer más