serveur

Internet Information Services (IIS) Manager. Bad Data. (Exception from HRESULT: 0×80090005)

0

Symptômes:

Lorsque vous accédez à la console IIS ou aux pools d’applications, vous avez l’erreur suivante:

Bad Data. (Exception from HRESULT: 0x80090005)

Causes:

Vous avez copié le fichier de configuration de IIS d’une machine à l’autre (C:\Windows\System32\inetsrv\config\applicationHost.config)

Ce dernier contient des comptes Windows pour certains pools d’applications. Le mot de passe est encrypté en utilisant une clé locale à la machine, l’autre serveur n’arrive donc pas à les décrypter.

Corriger le mot de passe à la main depuis la console IIS ne résous pas le problème.

Résolution:

2 possibilités:

  • Faire un retour arrière sur le serveur où la configuration a été copiée. Par défaut IIS garde une copie des 10 derniers fichiers de configuration (C:\inetpub\history)
  • Utiliser la méthode supportée pour copier la configuration.

Exporter la configuration:

aspnet_regiis -px "iisConfigurationKey" "C:\iisConfigurationKey.xml" -pri 
aspnet_regiis -px "iisWasKey" "c:\iisWasKey.xml" –pri

Importer sur la cible:

aspnet_regiis -pi "iisConfigurationKey" "C:\iisConfigurationKey.xml" 
aspnet_regiis -pi "iisWasKey" "C:\iisWasKey.xml"

TechED 2012 Europe: la meilleure session

0

Les techED sont maintenant terminées… Voici ma session préférée:Windows Azure Internals

Mark Russinovich (qu’on ne présente plus) montre l’autre côté du miroir pour Azure.

Eléments les plus marquants:

  • ~10 personnes pour administrer 100 000 serveurs physiques!
  • Démonstration d’une interface d’administration Azure,
  • Vue graphique des racks avec les VM,
  • Démonstration de self healing de la plateforme,
  • Explications sur le bug du 29 février, avec la ligne de commande qui a tout planté

Je vous préviens, c’est du lourd :)

Elle est disponible en ligne ici (slides + vidéo): http://channel9.msdn.com/events/TechEd/Europe/2012/AZR302

Restaurer une base SQL server via powershell

0
clear

#---------------------------------------------------
$server="mysqlserver"
$endpoint_port="5022"
$instance="myNamedSQLinstance"
$emailFrom = "provisioning@mydomain.com"
$emailTo = "mathieu.chateau@lotp.fr"
$smtpServer = "mysmtpserver"
$sendmail=$true
$foldersource='\\myfileserver\backupFromDev$'
$folderarchived='\\myfileserver\backupFromDev$\done'
$excludeList=@()
$excludeList+='master'
$excludeList+='tempdb'
$excludeList+='model'
#---------------------------------------------------
$foldersource="c:\"
$folderarchived="F:\"

$majorError=$true
$global:log=@()
try
{
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")  | out-null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")
    $source = new-object ('Microsoft.SqlServer.Management.Smo.Server') "$server\$instance"
    $majorError=$false
}
catch
{
       AddLog "major error, one side not reachable $_"
       "major error, one side not reachable $_"
       $majorError=$true
}

function AddLog($text)
{
       $global:log+=$text
       Write-Host $text
}

if ($majorError -eq $false)
{
       $databases = $source.Databases
       foreach ($file in (Get-childitem $foldersource -Filter "*.bak"))
       {
               $dbname=$file.Name -replace (".bak","")
               if ($excludeList -notcontains $dbname)
            {
                #not on the blacklist
                if (($databases | ?{$_.Name -ieq $dbname}) -eq $null)
                {
                    #database does not exist
                    try
                    {
                        #Restore
                        $targetDBFilePath = $source.MasterDBPath + "\" + $dbName + ".mdf"
                        $targetLogFilePath = $source.MasterDBLogPath + "\" + $dbName + ".ldf"
                        AddLog "   going to restore $dbname to:"
                        AddLog "   $targetDBFilePath and $targetLogFilePath"
                        $restore = new-object ('Microsoft.SqlServer.Management.Smo.Restore')
                        $restore.Action = 'Database'
                        $restore.Database = $dbname
                        ##$backupDataFile=$dbbk.Devices[0].Name
                        #$restore.Devices.AddDevice($backupDataFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
                        $backupfile=New-Object ("Microsoft.SqlServer.Management.Smo.BackupDeviceItem")($file.FullName, "File")
                        $restore.Devices.Add($backupfile)
                        #$restoredetails=$restore.ReadBackupHeader($source)
                        $relocateDataFile = new-object ('Microsoft.SqlServer.Management.Smo.RelocateFile')
                        $relocateLogFile  = new-object ('Microsoft.SqlServer.Management.Smo.RelocateFile')
                        $dbFileList = $restore.ReadFileList($source)
                        $relocateDataFile.LogicalFileName = $dbFileList.Select("Type = 'D'")[0].LogicalName
                        $relocateDataFile.PhysicalFileName = $targetDBFilePath
                        $relocateLogFile.LogicalFileName = $dbFileList.Select("Type = 'L'")[0].LogicalName
                        $relocateLogFile.PhysicalFileName = $targetLogFilePath
                        $restore.RelocateFiles.Add($relocateDataFile)
                        $restore.RelocateFiles.Add($relocateLogFile)
                        $restore.ReplaceDatabase = $False
                        $restore.NoRecovery = $False
                        $restore.SqlRestore($source)
                        AddLog "     Restore done"
                        Move-Item $file.FullName $folderarchived
                    }
                    catch
                    {
                        AddLog "    error during restore: $_"
                        $majorError=$true
                        break
                    }
                    
                }
                else
                {
                    #blacklisted name
                    AddLog "database $dbname / $($files.Names) already exist"
                }
            }
            else
            {
                AddLog "Forbidden databasename: $dbname"
            }
       
       }
}

if($sendmail)
{
       $temp=""
       foreach ($line in $log)
       {
              $temp+=$line+"`r`n"
       }
       $smtp = new-object Net.Mail.SmtpClient($smtpServer)
       $smtp.Send($emailFrom, $emailTo,"SQL mirror automator",$temp)
}


$log

rdp rejected

Ferme RDP avec broker: comment accéder à un serveur spécifique ?

0

Hypothèses

  • Vous avez une ferme RDP avec par exemple 2 serveurs RDP,
  • Vous avez le broker en place, donc les utilisateurs sont redirigés vers leur connexion actuelle (affinité),
  • You avez restreint à une session par utilisateur.

Problème

Quand vous essayez de joindre un serveur RDP spécifique de la ferme (pour faire de l’admin dessus ou aider un utilisateur qui est dessus), vous êtes refusé:

La connexion ne peut pas être établie car l’ordinateur distant qui a été joint n’est pas celui que vous avez spécifié. 
Cela peut être dû à une entrée obsolète du cache DNS. Essayez d’utiliser l’adresse IP de l’ordinateur à la place du nom.

 

Idem en essayant par l’adresse IP comme suggéré:

Cet ordinateur ne peut pas se connecter à l’ordinateur distant.

L’ordinateur distant auquel vous essayez de vous connecter vous redirige vers l’ordinateur distant. 
La Connexion Bureau à distance ne peut pas vérifier que les deux ordinateurs distants appartiennent à la même batterie de serveurs. 
Ceci peut se produire si un autre ordinateur du réseau porte le même nom que celui auquel vous tentez de vous connecter.

 

Solution

Il suffit d’utiliser le fameux /admin du client RDP pour bypasser les règles !

 

 

sharepoint PowerShell rename web application

SharePoint 2010 PowerShell : renommer une Application Web

0

Une recherche google semble indiquer que renommer une application Web SharePoint est compliqué et passe par un backup/suppression/création/Restore.

Etant de nature un peu…Opiniatre ? j’y suis allé « au flanc » en PowerShell…Et ca marche :)

Les commandes:

$a=Get-SPWebApplication | where {$_.Name -match "Demo"#on vérifie que l'on a bien que l'application à modifier
$a
#On change le nom
$a.Name="[Demo] demo blah blah"
#On pousse la modification
$a.Update()

#on vérifie que le nom a bien changé
Get-SPWebApplication | where {$_.Name -match "Demo"}

failover_cluster_error_87

Windows 2008 failover cluster: Failed to prepare storage for testing on node <> status 87

0

En voulant monter un failover cluster Windows Server 2008 R2:

 

 

 

 

 

 

 

Pour corriger le problème, il faut assigner temporairement une lettre de lecteur à la partition bitlocker (FAT32 / 2Go) (créée automatiquement par Windows):

 

 

 

et voilà :)

tmg 2010 no such interface supported

TMG 2010: joindre une array: no such interface supported…

0

En voulant joindre un TMG 2010 à un autre pour former un array (une ferme quoi), j’ai obtenu le message d’erreur suivant très explicite:

tmg 2010 no such interface supported 0x80004002

Cela était dû au fait que l’autre noeud avait le Service pack 1 de TMG 2010, et pas celui ci…En essayant la jonction dans l’autre sens, le message d’erreur met au moins un peu sur les rails avec un problème de version du fichier de configuration.

 

dedibox r410

Dedibox: port cisco down & idrac: la double peine

2

Faisant face à quelques difficultés avec Dedibox, je souhaitais partager avec vous mon analyse.

La nouvelle offre Dedibox s’appuie sur des serveurs Dell, et propose un accès à l’idrac de votre serveur. Cela permet de faire l’installation de l’OS soit même (par exemple Windows en montant l’iso à travers l’idrac).

Dell propose 2 méthodes pour connecter l’idrac:

  • Dédié: l’accès se fait à travers un port Ethernet.
  • Partagé: l’accès se fait à travers les cartes réseaux normales du serveur.

C’est cette deuxième solution que Dedibox a retenue. Elle leur permet évidemment une grosse économie:

  • de câblage réseau (surtout vu la quantité de serveurs),
  • De ports sur les commutateurs (1 par machine).

Cela ne me pose pas de problème au demeurant, mais cela se complique avec leur politique de gestion du réseau et de sa sécurité. La couleur est annoncée tout de suite: en cas de problème détecté, le switch coupe le port réseau associé. Il faut alors ouvrir un ticket pour être débloqué.

Impact: quand le port est coupé par le switch, on perd également l’accès à l’idrac. D’où la double peine: le serveur n’est plus joignable, et on ne peut même pas réparer via l’idrac.

La connexio à l’idrac se passe en plusieurs phases:

  • Connexion à la console de gestion Dedibox
  • Accès au menu idrac
  • Génération d’une URL d’accès (idrac.online.net qui fait office de reverse proxy) contenant un token d’accès unique
  • Depuis l’interface idrac de Dell, accès à la console virtuelle (uniquement via Java, activeX est désactivé)
  • Téléchargement d’un Java Webstart (fichier jnlp)
  • Lancement de l’applet Java

19-02-2011 14-09-58

Sécuriser son Windows dans le cloud (Dedibox/Amazon…)

0

Suite  à mon retour vers Dedibox, et le fait que j’y installe du Windows, je me suis demandé ce que je pouvais faire pour la sécuriser.

Voici les pistes envisagées:

  • Pas de port TCP accessible directement. Passer donc par exemple avec LogMeIn, au moins pendant la configuration. L’accès idrac n’est pas assez fluide et simple d’accès.
  • Renommer le compte Administrateur via GPedit
  • Interdire l’affichage du dernier compte authentifié via GPedit.
  • Ajouter un disclaimer, toujours via GPedit. Cela n’arrêtera pas un pirate motivé, mais peu suffire à bloquer certains logiciels de brute force RDP.
  • Autoriser RDP mais:
    • Sur un port TCP non standard. Procédure Microsoft : http://support.microsoft.com/kb/306759/en-us/
    • Utiliser le firewall Windows pour autoriser l’accès uniquement depuis certaines IP fixes. Pour y accéder depuis ailleurs, d’abord se connecter en LogMeIn pour modifier la règle firewall.
    • Autoriser uniquement les clients permettant une authentification réseau.
  • Scanner régulièrement les adresses IP depuis l’extérieur avec nmap pour vérifier ce qui est visible.
  • Appliquer les mises à jour Windows dès leur sortie.

16-02-2011 08-25-44

Dedibox: Nat de VM Hyper-V

4

Suite au retour sur Dedibox, j’ai décidé d’utiliser Hyper-V plutôt que VMware pour la virtualisation. Les adresses IP publiques sont facturées chez Online.net, et d’autre part je ne veux pas que certaines VM soient exposées sur Intrenet (DC, Exchange…).

Par défaut, Hyper-V ne permet pas de faire du Nat, et donc cacher tout se beau monde tout en leur donnant accès à Internet.

Voici les grandes étapes:

  • Installer le rôle Network Policy and Access Services
  • Créer un réseau interne dans Hyper-V
  • Assigner une adresse IP fixe (ex 192.168.1.1) sur la carte réseau du réseau ainsi crée (carte virtuelle Hyper-V)
  • Configurer Routing and Remote Access pour faire du NAT
  • Configurer les VM afin d’utiliser le réseau virtuel Hyper-V et de passer en DHCP ou IP fixe suivant vos souhaits.

Ajouter le rôle

Configurer le NAT

Haut de page