Let’s Encrypt for Windows

Comme certain l’on peut-être vu, Mozilla puis Google ont décidé de révoquer les certificats racine de StartSSL sur leur version du navigateur sorti en janvier 2017, suite à des comportements particulièrement douteux de la part de WoSign, tant au niveau technique qu’au niveau de la transparence et de la communication. WoSign contrôlant totalement StartSSL suite à un rachat.

C’est une décision que je félicite car aujourd’hui, toute la sécurité Web repose sur l’utilisation de certificats, lesquels sont émis par une ou plusieurs autorité(s) intermédiaire(s) puis une autorité racine. La différence technique entre une autorité intermédiaire et une autorité racine est simplement au niveau des certificats présent sur les magasins de certificats côté client. En effet un des critères pour qu’un certificat soit reconnu comme valide, est qu’il soit signé par un certificat d’autorité reconnu. Afin d’être reconnu, ce certificat doit soit être lui-même signé par un certificat d’autorité reconnu, soit être manuellement accepté. On voit ainsi se former une chaîne de confiance, où il suffit de reconnaître un certificat d’autorité (qu’on appellera alors certificat d’autorité racine) pour reconnaître automatiquement tout certificat émis par cette autorité, de manière récursive. Cela présente notamment l’avantage de limiter le nombre de certificats à ajouter à la liste des certificats d’autorité de confiance côté client, parce qu’il y en a vraiment beaucoup.

Chaîne de confiance

Un problème majeur est qu’avec le système actuel, toute autorité de certification est en capacité d’émettre un certificat pour n’importe quel domaine. Et ce n’est pas l’ajout d’un en-tête HTTP Public Key Pinning qui peut résoudre ce problème, en effet, à partir du moment où un MITM est possible en SSL, modifier l’en-tête HPKP est un jeu d’enfant. C’est donc une bonne chose que ces grands groupes restent vigilant quant aux exactions de ces autorités, même si très sincèrement ça m’a aussi fait chier.

D’un autre côté, la décision a été prise fin octobre 2016 pour une prise d’effet concrète dès mi-janvier 2017 au niveau du système de messagerie, puis quelques jours après avec la sortie de Chrome 56. On serait tenté de croire que 2,5 mois est plutôt long, mais ça n’a pas été le cas. Bien que prévenu en avance, il n’a pas été possible de dégager suffisamment de temps pour effectuer le renouvellements de tous nos certificats émis par StartSSL, la prise d’effet nous a pris de cours et il a fallu faire les remplacements à l’arrache.

Let’s Encrypt, shall we go ?

En remplacement de StartSSL, nous avons 3 possibilités :

  • la classique autorité, qui te fait payer rubis sur ongle chaque certificat émis
  • let’s encrypt, qui est une initiative open source, soutenue par Mozilla et permet d’émettre gratuitement des certificats RSA ou EC avec l’autorisation du owner du site web pour une durée de 3 mois
  • certcom, qui est similaire à StartSSL, à savoir l’émission de certificats gratuits, mais cette autorité n’est reconnue de base par aucun navigateurs ou OS majeur

Let’s Encrypt semble une bonne solution mais deux choses m’avais rebuté jusqu’à présent :

  • La difficulté de trouver et comprendre la spécification de leur web services pour les étapes de vérification et de génération du certificat. Je n’ai à ce jour toujours rien trouvé si ce n’est du charabia abscons sans rapport avec ce workflow
  • Le programme client officiel qui exige d’être root pour effectuer le workflow. Le programme est monstrueusement gros d’une part, donc nécessite un audit plutôt long, et la nécessité d’être root est clairement un abus de pouvoir ou une fainéantise des devs, au choix. Dans les deux cas, c’est mal.

Je suis tombé mi-décembre sur acme-tiny, qui est un client open-source pour let’s encrypt en python et particulièrement light. Suffisamment pour auditer et comprendre son fonctionnement, et générer un script non-root qui saura faire le job dans les règles de l’art. C’est ce qui est en place sur mes environnements Linux, et cela inclut notamment ce blog. Un tutoriel existe pour sa mise en place sous Gentoo.

Partant de ce succès sous Linux, je me suis mis en tête de porter cette solution sous Windows+IIS. Le seul travail de recherche restant étant d’assurer une compatibilité de acme-tiny pour Windows. Ce dernier étant écrit en python, le travail est déjà mâché et s’est au final avéré relativement rapide.

Pré-requis installation

  1. Installer un interpréteur Python 2.7, par exemple ActivePython
  2. A partir de Python 2.7.10, l’interprêteur valide les certificats par défaut. Cela requiert d’installer certifi de la manière suivante : pip install certify[secure]
  3. Installer les binaires OpenSSL pour Windows. Il n’existe pas de version compilée de OpenSSL officielle. J’utilise ceux fournit par Shining Light Productions, la version Light est suffisante.
  4. Créer le dossier %SYSTEMDRIVE%\letsencrypt  et déposez-y le script Python ainsi que les deux scripts PowerShell (voir au bas du post pour les récupérer).
    • Ce dossier contiendra les clés privées des sites web et ne doit donc être accessible en lecteur que par l’utilisateur qui va effectuer le renouvellement de certificat. Pour ma part, il s’agit de SYSTEM.
  5. Créer le dossier et les sous-dossiers %SYSTEMDRIVE%\inetpub\letsencrypt\acme-challenge
    • Ce dossier doit être accessible en lecture écriture par le processus qui va effectuer le renouvellement de certificat
    • Ce dossier doit être accessible en lecture par les sites web
  6. Ajouter ce fichier web.config au dossier %SYSTEMDRIVE%\inetpub\letsencrypt\acme-challenge
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<system.webServer>
		<staticContent>
			<mimeMap fileExtension=".*" mimeType="text/plain"/>
		</staticContent>
		<handlers>
			<clear />
			<add name="StaticFile" path="*" verb="GET" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" requireAccess="Read" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" />
		</handlers>
	</system.webServer>
</configuration>

Avant de générer le premier certificat, il est nécessaire de créer une clé privée afin d’être reconnu par Let’s Encrypt. Cela se fait avec les commandes suivantes dans une console administrative :

cd "$env:SystemDrive\letsencrypt"
Import-Module .\get-signed-cert.ps1

# where letsencrypt-account.key is where the key will be written
New-LetsEncryptAccountKey -Outfile letsencrypt-account.key

Note : pour l’instant le script d’acme-tiny a été modifié pour le faire fonctionner sous Windows et ne fonctionne plus pour Linux. Je dois le nettoyer un peu et ferais un pull-request sur le dépôt afin d’intégrer cette capacité au script sans besoin de le modifier manuellement.

Pré-requis pour chaque site web

Une fois l’installation au niveau du serveur effectué, il y a une manipulation à effectuer pour chaque site web à sécuriser. Il faut ajouter un répertoire virtuelle à la racine du site, nommé .well-known  et devant pointer sur %SYSTEMDRIVE%\inetpub\letsencrypt , créé précédemment, comme suit :

Puis nous allons générer une clé privée (au moins deux si vous utilisez HPKP) dédiée à ce site. A ce jour, il existe deux types de clefs qui sont supportés, les vénérables clés RSA et les fancy clés à base de courbes elliptiques.

cd "$env:SystemDrive\letsencrypt"
Import-Module .\get-signed-cert.ps1

# for generating an ecc key
New-ECPrivateKey -Password aFuckingGoodPassword -Outfile mywebsite-ec.key

# for generating an rsa key
New-RSAPrivateKey -Password anotherFuckingGoodPassword -Outfile mywebsite-rsa.key

Le script génère des clés RSA de 2048 bits, et des clés ECC en utilisant, pour le moment, la courbe prime256v1, aussi nommé NIST-P256.

Warning : Je sais que cette courbe présente des faiblesses, mais je n’ai pas encore eu le temps de me pencher sur leurs impacts ni pu trouver un remplaçant, sachant que toutes les courbes ne sont pas aptent à faire du HTTPS en TLS 1.2.

Générer un Certificat

La génération d’un certificat se fait en une seule commande qui devrait bien se passer, pourvu que vous ayez bien suivi toutes les étapes d’installation, y compris au niveau de la configuration des accès.

Import-Module .\get-signed-cert.ps1

Renew-Certificate -SiteName "MyWebSite1" -KeyFile MyWebSite1-ec.key -KeyFilePassword 'a Fucking good Password' -LetsEncryptKey letsencrypt-account.key

Il reste l’automatisation. Pour ce faire, nous allons simplement enregistrer le script ci-dessus dans le fichier renew MyWebSite1.ps1  et l’enregistrer dans le dossier %SYSTEMDRIVE%\letsencrypt . Puis il reste à créer la tâche planifiée. Afin de ne pas avoir à gérer le changement de mot de passe sur les utilisateurs standard, j’ai configuré la tâche pour qu’elle s’exécute avec l’utilisateur SYSTEM.

Création d'une tâche planifiée exécutée par SYSTEM

L’action sera l’exécution d’un programme, avec les paramètres suivants :

  • le programme : %windir%\System32\WindowsPowerShell\v1.0\powershell.exe
  • les arguments: -Run .\renew.ps1
  • Le dossier de travail (où se trouve le script renew.ps1) : C:\letsencrypt
    La tâche planifiée va exécuter le programme %windir%\system32\WindowsPowerShell\v1.0\powershell.exe -Command ". renew mywebsite.ps1"Configuration du trigger pour un déclenchement le 1 de chaque mois

Le certificat étant valide 3 mois, on peut se limiter à un renouvellement mensuel, ce qui permet en outre d’avoir 2 renouvellements ratés sans que cela ne perturbe l’accessibilité du site.

Le CSR et le certificat ne sont pas conservé sur le disque, seul la clé est conservée. Le CSR est bien suffisant pour récupérer le certificat signé, cependant l’import d’un certificat avec sa clé privée dans le magasin de certificats de Windows nécessite de l’importer avec sa clé privée. Il n’est à ma connaissance pas possible par exemple d’importer juste le certificat (publique), puis de l’associer avec la clé qui va bien dans le magasin de certificat.

Le Script

On y est, voici le cœur de la machine.

OpenSSL ne se trouvant par défaut pas dans le path, il est nécessaire d’indiquer au script où il se trouve, ce qui est fait à la ligne 4, et que vous aurez peut-être à modifier.

# script to generate a signed certificate for a single domain
Import-Module WebAdministration -ErrorAction Stop

$OPENSSL_PATH = 'C:\OpenSSL-Win64\bin'
$DefaultCertStore = Cert:\LocalMachine\WebHosting

if (-not ($env:Path -contains $OPENSSL_PATH)) {
    $env:Path += ";$OPENSSL_PATH"
}

function Get-TempPassword {
    param(
        [int]$Size
    )

    -join ((45..57) + (65..90) + (97..122) | Get-Random -Count $Size | % {[char]$_})
}

function New-RSAPrivateKey {
    param(
        [string]$Password,
        [string]$OutFile,
        [int]$KeySize = 2048
    )

    if ([string]::IsNullOrEmpty($Password)) {
        openssl genrsa -out $OutFile $KeySize 2> $null
    } else {
        if ($Password.Length -lt 4) {
            Write-Error "The password MUST be greater than 4 chars"
            return
        }
        
        openssl genrsa -out $OutFile -aes128 -passout pass:$Password $keySize 2> $null
    }
}

function New-LetsEncryptAccountKey {
    param(
        [string]$Outfile
    )

    New-RSAPrivateKey -OutFile $Outfile -KeySize 4096
}

function New-ECPrivateKey {
    param(
        [string]$Password,
        [string]$Outfile
    )

    $ec_name = 'prime256v1'

    $ec_param = & openssl ecparam -conv_form compressed -name $ec_name -genkey

    if ([string]::IsNullOrEmpty($Password)) {
        $ec_param | & openssl ec -out $Outfile 2> $null
    } else {
        if ($Password.Length -lt 4) {
            Write-Error "The password MUST be greater than 4 chars"
            return
        }

        $ec_param | & openssl ec -out $Outfile -aes128 -passout pass:$Password 2> $null
    }
}

function New-CertificateRequest {
    param(
        [string]$KeyFile,
        [string]$KeyFilePassword,
        [string]$DomainName,
        [string]$OutFile
    )

    if ([string]::IsNullOrEmpty($KeyFilePassword)){
        openssl req -new -subj /CN=$DomainName/ -sha256 -key $KeyFile -out $OutFile
    } else {
        openssl req -new -subj /CN=$DomainName/ -sha256 -key $KeyFile -out $OutFile -passin pass:$KeyFilePassword
    }    
}

function Renew-Certificate {
    param(
        [string]$SiteName,
        [string]$LetsEncryptKey,
        [string]$KeyFile,
        [String]$KeyFilePassword,
        [string]$CertStore = $DefaultCertStore
    )

    $rootLetsEncrypt = "$env:SystemDrive\inetpub\lets-encrypt"
    $webSite = Get-Website -Name $SiteName
    $rootPath = $webSite.physicalPath
    $bindingString = ($webSite | Get-WebBinding -Protocol http).bindingInformation
    $domainName = $bindingString.Split(':')[2]

    if (-not (Test-Path $rootLetsEncrypt -PathType Container)) {
        New-Item $rootLetsEncrypt -ItemType Directory
    }

    $csr = [System.IO.Path]::GetRandomFileName()
    $csrFullPath = [System.IO.Path]::Combine($env:TEMP, $csr)
    $crt = [System.IO.Path]::GetRandomFileName()
    $crtFullPath = [System.IO.Path]::Combine($env:TEMP, $crt)

    Write-Host "CRT: $crtFullPath"

    New-CertificateRequest -KeyFile $KeyFile -KeyFilePassword $KeyFilePassword -DomainName $domainName -OutFile $csrFullPath
    & python .\acme-tiny.py --account-key $LetsEncryptKey --csr $csrFullPath --acme-dir $rootLetsEncrypt\acme-challenge > $crtFullPath

    $pfx = [System.IO.Path]::GetRandomFileName()
    $pfxFullPath = [System.IO.Path]::Combine($env:TEMP, $pfx)
    $pfxPassword = Get-TempPassword 12
    $displayName = "Let's Encrypt $domainName $([datetime]::Today.ToString("yyyy-MM-dd"))"
    Get-Content -Path $KeyFile,$crtFullPath | & openssl pkcs12 -export -name $displayName -passout pass:$pfxPassword -passin pass:$KeyFilePassword -out $pfxFullPath
    $cert = Import-PfxCertificate -FilePath $pfxFullPath -Password (ConvertTo-SecureString -AsPlainText -Force $pfxPassword) -CertStoreLocation $CertStore -ErrorAction Stop

    $currentSSLBinding = Get-Item IIS:\SslBindings\* | Where-Object { $_.Port -eq 443 -and $_.Host -eq $domainName }
    $currentSSLBindingName = $currentSSLBinding.PSChildName

    $currentSSLBinding | Remove-Item
    Get-Item -Path "$CertStore\$($cert.Thumbprint)" | New-Item -Path IIS:\SslBindings\$currentSSLBindingName

    Remove-Item $pfxFullPath
    Remove-Item $crtFullPath
    Remove-Item $csrFullPath
}

Ce script se découpe en 2 parties :

  • La première partie est principalement du wrapping autour de openssl pour générer des clés privées en RSA ou ECDSA.
  • La seconde partie est l’utilisation de acme-tiny (wrapping), et la reconfiguration de IIS et le magasin de certificat de Windows avec des cmdlets natives

Il est relativement simple à lire. On peut remarquer qu’un binding ne peut pas être modifié, il doit être détruit puis être recréée.

Références

git 4 windows avec un certificat SSL non-reconnu

Une histoire de magasin

J’ai de temps en temps besoin d’utiliser git en ligne de commande lorsque le GUI, en l’occurrence Visual Studio, ne suffit pas. Mais dans ce cas, la ligne de commande peut refuser de faire un pull ou un push si le dépôt git commun est accessible via HTTPS et qu’il utilise un certificat interne. C’est à dire que le certificat présenté par le serveur n’est pas auto-signé, mais signé par une autorité de certification non reconnue, comme c’est souvent le cas en entreprise (la vente de certificat n’est rien de plus qu’une grosse arnaque).

Ce problème existe aussi pour les autres outils graphiques qui sont basés sur git for windows, comme l’excellent TortoiseGit.

On est alors confronté au soucis suivant : même si Windows, Visual Studio, Internet Explorer ou Chrome reconnaissent ce certificat, ce n’est pas le cas de git en ligne de commande sous Windows. La raison est que le magasin des certificats racines n’est pas le même. Ce problème avec git n’existe pas sous un système *NIX. Cela arrive typiquement dans les cas suivants :

  • le navigateur est Firefox
  • l’application est écrite en Java
  • l’application embarque mingw ou similaire

Chacune de ces applications ou runtime utilisent leur propre magasin de certificat, ce qui explique qu’une négociation SSL qui passe sous VStudio ne passe plus avec git.

Faire marcher git en SSL avec un certificat interne

J’indique dans ce billet comment ajouter un certificat racine pour git 4 windows. La commande est extrêmement simple, mais la difficulté a résidé à savoir quel est le fichier à modifier. En effet, si l’on regarde le packaging de git, on peut voir des certificats trainer un peu partout, ce n’est pas très propre:

  • ~/usr/ssl/certs/ca-bundle.crt
  • ~/usr/ssl/certs/ca-bundle.trust.crt
  • ~/usr/ssl/cert.pem
  • ~/etc/pki/ca-trust/extracted/java/cacerts
  • ~/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
  • ~/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  • ~/mingw64/etc/pki/ca-trust/extracted/java/cacerts
  • ~/mingw64/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
  • ~/mingw64/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  • ~/mingw64/share/pki/ca-trust-source/ca-bundle.trust.crt
  • ~/mingw64/ssl/cert.pem
  • ~/mingw64/ssl/certs/ca-bundle.crt
  • ~/mingw64/ssl/certs/ca-bundle.trust.crt

Alors lequel est-ce ? Et bien c’est l’avant dernier.

Une fois qu’on l’a identifié, la manipulation est enfantine : il suffit d’éditer ce fichier et de lui coller tous les certificats racines supplémentaires au format PEM, comme le fait cette commande avec un shell type bash :

cat ca.crt >> /c/Program\ Files/Git/mingw64/ssl/certs/ca-bundle.crt

Cette manipulation sera à refaire après chaque mise à jour de git for windows.

Il existe un paramètre permettant d’indiquer à l’outil en ligne de commande de ne pas vérifier le certificat du serveur. Cela n’est pas du tout équivalent à ma solution en ce sens que ma solution permet bien d’authentifier le serveur, et que cette solution, si elle fonctionne pour git, ne fonctionne pas forcément pour les outils basés sur git comme TortoiseGit.

Installer PHP sous Windows mais sans Apache

Vu l’incapacité de l’équipe PHP à fournir des instructions d’installation correctes (genre à jour) sous Windows (ou le manque de volonté, cela revient au même), et parce qu’Apache sous Windows est une hérésie (alors que sous Linux, c’est simplement de la débilité), je m’atèle à résoudre ce problème.

Installation automatique

Je ne m’étendrai pas beaucoup là-dessus, il suffit de suivre les instructions de cette page. La dernière fois que j’ai tenté cette installation, j’ai eu quelques soucis mineurs, on va dire que pour une install rapide, ça ne marche pas trop mal.

Installation manuelle pour IIS6

A quelques détails près, la procédure à suivre est similaire à celle pour IIS7. Par contre continuer à utiliser II6 et surtout pour autre chose que du .NET, ça craint d’un point de vue sécurité.

Installation manuelle pour IIS7 et +

La procédure est identique en tout point à celle pour IIS Express (plus bas), sauf qu’il faut être admin de la machine et que le bon fichier de configuration se trouve dans C:\Windows\System32\inetsrv\config .
L’avantage néanmoins d’avoir un IIS pas express, c’est qu’il y a une interface graphique, c’est probablement plus simple et safe que de sortir directement le burin.

Je détaillerai prochainement la partie graphique (avec des screen) et complètement cette section.

Installation manuelle pour IIS Express

  • Installez IIS Express si ce n’est pas déjà fait en le téléchargeant ici. C’est la seule étape qui nécessite d’être administrateur de la machine, tout le reste peut être réalisé par un utilisateur lambda.
  • Téléchargez la (dernière de préférence) version de PHP ici en prenant soin de préférer la version non thread-safe (NTS) : http://windows.php.net/download/#php-5.4
  • Décompressez php où vous le souhaitez, par exemple dans %ProgramFiles(x86)%\PHP 5.4.17  si vous êtes administrateur ou bien dans %USERPROFILE\AppData\Local\PHP 5.4.17 s’il s’agit d’une installation locale à un utilisateur particulier. Pour la suite de la procédure, on considèrera %INSTALL% %INSTALL%  comme le répertoire d’installation de PHP.
  • Éditez le fichier %USERPROFILE%\Documents\IISExpress\config\applicationhost.config de l’utilisateur souhaitant bénéficier de PHP sur sa plateforme IIS Express
  • Cherchez le nœud fastCgi  dans le nœud system.webServer  et ajoutez-y le nœud suivant : <application fullPath= »%INSTALL%\php-cgi.exe » />
  • Ajoutez ensuite le handler suivant (nœud à ajouter dans le nœud handlers) <add name= »php5″ path= »*.php » verb= »* » modules= »FastCgiModule » scriptProcessor= »%INSTALL%\php-cgi.exe » resourceType= »File » /> . Attention, ce handler doit être ajouté avant les handlers génériques, en particuliers les handlers suivants : StaticFileModule  et les ExtentionlessUrl* .
  • Éditez le fichier %INSTALL%\php.ini  en prenant comme base le fichier php.ini-production  (par exemple) qui se trouve dans le même répertoire
    • Fixez le path comme suit : include_path = « .;%INSTALL%\ext »
    • Fixez cgi.force_redirect = 0
    • Dans la section [Date] , fixez le timezone comme suit : date.timezone = Europe/Paris
    • Spécifiez la variable ext à ext
    • [Optionnel] Mettez la variable short_tags  à On
  • C’est normalement terminé, il n’y a plus qu’à tester le bon fonctionnement de PHP avec le classique <?php phpinfo();

Note

L’équipe PHP ne propose que des builds 32 bits. Il y a des builds 64 bits, mais elles ne sont actuellement pas considérées comme stable.

Associer un utilisateur de base de données à une connexion SQL Server

Lorsqu’on fait des imports d’un serveur SQL Server à l’autre et que l’on utilise l’authentification en mode SQL, il peut arriver que des connexions SQL soient refusées. En réalité, le lien entre une connexion SQL Server et un utilisateur de base de données n’existe plus.

La méthode barbare auquel on pourrait penser au premier abord pour remédier à ce problème est alors de supprimer l’utilisateur de la base de données pour le recréer, mais si cet utilisateur a des droits particuliers, tous ces droits sautent et il faut les réattribuer.

Microsoft fournit une fonctionnalité permettant de modifier les mappages entre utilisateurs de base de données et connexions SQL Server, très utile dans ce cas précis.

Exemple d’utilisation : exec sp_change_users_login ‘Update_one’, ‘username’, ‘loginname’
username  est un utilisateur de base de données et loginname  une connexion SQL Server.

Cette méthode semble dépréciée par Microsoft, mais est toujours utile pour une utilisation exceptionnelle.

Voir aussi

Active Directory: le service de réplication de fichiers échoue

Dès lors qu’il y a plusieurs contrôleurs de domaines dans un domaine Active Directory, il peut y avoir des problèmes de réplication des fichiers, ce qui empêche la fonction de contrôleur de domaines sur les serveurs sur lesquels il n’y a pas eu de réplication, et là c’est la merde.

La réplication en question concerne les fichiers des dossiers partagés SYSVOL et NETLOGON. Ils contiennent entre autres les stratégies de sécurité, et les scripts de démarrage.
Afin d’être opérationnel, tous les contrôleurs de domaines doivent avoir exactement les mêmes fichiers dans les partages SYSVOL et NETLOGON.

Une des solutions est de forcer un des contrôleurs de domaines, souvent l’émulateur PDC, à être autoritaire sur la réplication de fichiers, de sorte que tous les autres contrôleurs de domaines le voient comme le master. Pour ce faire, arrêtez le service de réplication de fichiers (ceci est nécessaire pour ne pas réinitialiser la valeur du registre) puis naviguez jusqu’à la clef :

HKLM\SYSTEM\CurrentControlSet\Services\NtFrs\Paramaters\Backup/Restore\Process at Startup.

Editez ensuite la valeur DWORD BurFlags  et mettez lui la valeur D4.
Démarrez le serveur de réplication de fichiers, et le problème se résolvera tout seul. Les serveurs à problèmes se verront créer les partages SYSVOL et NETLOGON avec le contenu correct.

Voir aussi

Active Directory: le service de réplication de fichiers échoue (le retour)

Cette fois tout semble correcte, mais la réplication échoue encore avec l’événement 13552, la source Ntfrs et l’erreur FrsErrorJournalInitFailed.

L’erreur signifie tout simplement qu’il n’y a pas assez d’espace disque restant pour le service de réplication de fichiers. Il faut en effet au minimum 512Mo d’espace disque libre pour que le tout fonctionne. Après avoir fait le ménage, et si cela est toujours insuffisant, il est toujours possible de réduire la taille du journal pour l’adapter à l’espace disque restant. Pour cela, allez dans le registre à la clé HKLM\System\CurrentControlSet\Services\NtFrs\Parameters  et éditer la valeur DWORD Ntfs Journal size in MB . La valeur par défaut est de 512, la valeur du temps de Windows 2000 Server était de 128.

Redémarrez le service de réplication de fichiers une fois l’opération terminée.

Voir aussi

Gene6FTP: partage réseau inaccessible

Gene6FTP Server n’arrive plus à synchroniser un utilisateur Active Directory. Les partages réseaux sont en accès refusés et pourtant vous avec tous les droits (WTF ?).

Dans le gestionnaire d’événements, vous verrez alors :

Event ID: 2011 Source: Srv The server's configuration parameter "irpstacksize" is too small for the server to use a local device. Please increase the value of this parameter.

Dans ce cas, il faut faire un tour dans la base de registre et créer la valeur DWORD HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer \Parameters\IRPStackSize  avec une valeur par défaut de 15 si inexistante, puis augmentez-la de 3 jusqu’à ce que ça marche.

Redémarrez l’ordinateur à chaque fois pour tester le changement.

Voir aussi

Windows Installer se lance tout le temps

Un jour, je m’aperçois que pour tous les utilisateurs restreints, le lancement d’un logiciel de la suite Microsoft Office 2003 provoque celui de Windows Installer systématiquement, alors que tout se passe bien lorsqu’un compte ayant les privilèges administrateur est utilisé. Même soucis avec des produits Adobe.

Après avoir monitoré les activités au niveau du registre, j’observe des ACCESS DENIED  (accès refusés) localisés au niveau des sous-clés de HKEY_CLASSES_ROOT .

La solution consiste à réinitialiser les autorisations standards sur ces clés pour résoudre le problème.
En général :

Principal Autorisation
Administrators Full Control
SYSTEM Full Control
Users Read
RESTRICTED READ sur HKCR\CLSID seulement

Servez-vous de procmon de Sysinternals pour enregistrer et analyser toutes les activités au niveau de la base de registre et du système de fichiers.

Voir aussi

Pas de lag avec le mode PIO

Si comme moi, vous avez un lecteur optique branché en IDE et qui utilise encore le mode de transfert PIO (et ce malgré le fait que vous spécifiez Transfert DMA si disponible dans le gestionnaire de périphériques), vous avez pu remarquer que le PC devient horriblement lent lors de la gravure ou de la lecture d’un média. La musique devient saccadée, le mouvement de la souris n’est plus fluide ; bref une horreur.

Cela vient du fait que le mode PIO demande beaucoup d’interruptions et cela se traduit par des temps processeur important en faveur du lecteur, au détriment du reste du système et de ses applications.
Pour ceux qui ont un système multi-cœurs (ou multi-processeurs, c’est pareil), il est possible de supprimer ce lag en basculant toutes les interruptions sur un autre cœur dédié.

Solution 1 : éditer le fichier BOOT.INI

Pour cela, éditez le fichier BOOT.INI à la racine de la partition de boot et ajoutez le paramètre /INTAFFINITY  à la ligne de boot qui correspond à votre Windows. Cela donne chez moi :

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WHISTLER
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WHISTLER="Windows Server 2003, Enterprise" /NOEXECUTE=OPTOUT /FASTDETECT /SOS /INTAFFINITY

Solution 2 : Reconfiguration du pilote

Il peut aussi être possible de réactiver le transfert en mode DMA en passant par le registre. Pour cela, allez dans la sous-clé HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318} puis cherchez la sous-clé qui correspond à votre contrôleur IDE (probablement 0001 ou 0002 respectivement pour le contrôleur primaire et le contrôleur secondaire), puis supprimez les clés MasterDeviceTimingModeAllowed et MasterIdDataCheckSum (SlaveDeviceTimingModeAllowed et SlaveIdDataCheckSum si votre périphérique est branché en esclave).

Allez dans le gestionnaire de périphériques pour réactiver le DMA si possible :
devmgmt.msc -> Controller IDE ATA/ATAPI -> Primary/Secondary IDE Channel -> Paramètres avancés -> Périphérique (0 pour Maître, 1 pour Esclave) -> Transfert Mode = DMA si possible

Redémarrez l’ordinateur, puis consultez le gestionnaire de périphériques pour savoir si le DMA est revenu ou pas.

Désactiver l’hibernation sous Vista/Windows Server 2008

Depuis Windows Vista / Windows Server 2008, il n’y a plus d’interface graphique permettant de configurer l’hibernation. Le soucis, c’est qu’on a pas forcément des To d’espace disque à gaspiller pour cette fonctionnalité, surtout sur un PC portable avec un disque à plateaux pas des plus véloce (donc quand passer en hibernation prend 3 plombes).

Pas de problèmes, voici l’équivalent en ligne de commande pour désactiver l’hibernation et ainsi libérer x Go d’espaces disque (où x est la quantité de Go total de mémoire vive) : powercfg -HIBERNATE OFF .

Dédicace spéciale à mon école d’ingénieurs, qui a fait le choix d’un très bon modèle de PC portable, mais avec toutes les options au minimum 😀 (CPU sans les instructions de virtualisation, disque asthmatique,  2Go de RAM).

Note : oui j’utilise un OS serveur sur mon portable comme OS principal et non c’est pas déconnant du tout