• WMI - ALERTE performance : la classe Win32_OperatingSystem !

    ALERTE performance :  la classe Win32_OperatingSystem !

    La  classe WMI Win32_OperatingSystem est très populaire (à juste titre) chez les administrateurs système. Elle est fréquemment utilisée par exemple pour exécuter des actions spécifiques ou appliquer des stratégies de groupes (GPO)  spécifiques à une version  de Windows.

    Cette classe (cf http://msdn.microsoft.com/en-us/library/aa394239(v=vs.85).aspx ) semble bien anodine et ne « collecte » que des « informations statiques » .

    C’est sans compter avec le champ NumberOfProcesses !

    NumberOfProcesses

    Data type: uint32

    Access type: Read-only

    Number of process contexts currently loaded or running on the operating system.

     

     

    Pour déterminer la valeur de NumberOfProcesses, le provider WMI fait lui-même une requête WMI  « SELECT __RELPATH FROM Win32_Process  »  qui charge considérablement le système.

    Par exemple sur un « large serveur » RDS/Citrix avec :

    • Plusieurs GPOs ayant un filtre du type :Select * FROM Win32_OperatingSystem WHERE Version like '6.3%'

    • De scripts de logon avec des « select * Win32_OperatingSystem »

    • Des « brokers » ou des outils de monitoring exécutant des « Select * from Win32_Process »

    • De nombreux « logon »

    Vous observerez rapidement :

    • une forte consommation CPU dans le process WMIPRVSE

    • des temps de « logon » important

    • une forte contention « kernel »  liée à l’énumération des processus qui peut avoir des conséquences diverses et variées (lenteur lors du lancement du gestionnaire de tâches,…)

    La solution est de limiter les champs retournés par la requête WQL. Le provider de la classe Win32_OperatingSystem ne collecte alors que les infos demandées. La requête « select Version from   Win32_OperatingSystem » n’énumère pas  la liste des processus.

    Tip :

    L’activation du tracing « WMI-Activity » (http://msdn.microsoft.com/en-us/library/aa826686(v=vs.85).aspx) permet d’identifier ce type de problème.

    [10/17 03:46:47.0051 PM] [wbemtest.exe] [201c.1f84] ExecQuery: select * from win32_operatingsystem

    [10/17 03:46:47.0401 PM] [wmiprvse.exe] [12a0.15d4] ExecQuery: references of {__Win32Provider.Name="CIMWin32"}

    [10/17 03:46:47.0578 PM] [wmiprvse.exe] [12a0.15d4] ExecQuery: SELECT __RELPATH FROM Win32_Process

     

  • Recupération de partitions IX : Récupérer une partition efface par mégarde sur un disque basique GPT

    Travaillons aujourd’hui sur un autre scénario assez simple : Celui de la suppression accidentelle d’une partition.

    Supposons que cette partition

    clip_image001

    soit devenue

    clip_image002

    Comme d’habitude, on contrôle les secteurs habituels et on voit celui qui pourrait manquer.

    Au secteur 0, on a un MBR montrant une partition GPT qui occupe tout le disque

    clip_image003

    Au secteur 1, on retrouve un GPT Header :

    clip_image004

    Données:

    • Sector Signature : EFI PART
    • Version 0.1
    • Header Size : 5C
    • CRC32 of the Header : 2153345396
    • Current / Alternate GPT Header : 1 / 266338303
    • First / Last Usable LBA : 34 / 266338270
    • Disk GUID : {04D4F64A-0F7B-49CE-9013-CF4EF9121641}
    • Partition Table Address : 2
    • Partition Count : 128
    • Partition Table Entry Size : 128
    • CRC32 of Partition Table : 1583197318

    Et le secteur 266338303 montre la même chose.

    clip_image005

    Le secteur 2 nous montre une table de partitions ne contenant que la partition MSR (comme quoi, rien n’est perdu), et le secteur 266338271 (Last usable +1) nous montre la même chose.

    clip_image006

    Allons donc voir si une partition NTFS pourrait trainer sur le disque.

    Comme la partition MSR finit au secteur 262177, on devrait en trouver une plus loin, en principe aligné sur 64KB.

    C’est au secteur 264192 que nous allons la trouver

    clip_image007

    Total Sectors : 266072063 (~126.8 GB) : Le secteur de fin devrait se trouver 266336255 ( = 266072063 + 264192 )

    Clusters to MFT / MFTMirr : 786432 (LBA 6555648 = 264192 + 8*786432 ) / 2 (LBA 264208 = 264192 + 8*2)

    Et ce sont bien des entrées de MFT que l’on trouve à ces secteurs:

    clip_image008

    clip_image009

    Résumons-nous :

    • LBA 0 : La partition GPT
    • LBA 1 et Backup : Les GPT Headers
    • LBA 2 et Backup : Une table de partition ne contenant que la partition MSR
    • LBA 264192 et 266336255 : Encadrent la partition NTFS

    En principe, comme pour une partition MBR :

    • Sauvegarder le 1er secteur de la partition NTFS
    • Créer une partition occupant tout le disque sans la formater
    • Ecraser le 1er secteur de la nouvelle partition NTFS par celui précédemment sauvegardé.

    clip_image010

    Quand vient le moment de formater, ne pas formater.

    clip_image011

    A ce moment-là, le secteur 264192 a été vidé de son contenu (puisque nous n’avons pas fourni de file system)

    En écrasant ce secteur par celui que nous avons sauvegardé, c’est comme si nous formatons la partition.

    DskProbe.exe permet d’écraser un secteur du disque.

    clip_image012

    clip_image013

    Après vérification rapide (secteur de fin de partition, MFT, MFTMirr) un rescan du disque fait revenir la partition comme par magie.

    Serge Gourraud
    55 AA

  • Récupération de disques VIII : Récupérer un disque basiques gpt

    Maintenant que nous avons vu les structures qui décrivent les partitions des disques basiques GPT, voyons où nous pouvons rencontrer une corruption et comment la réparer (ou pas)

    Si nous reprenons notre schéma, une corruption pourrait arriver :

    • Dans le MBR
    • Dans le GPT Header
    • Dans la table de partition (qui occupe les secteurs 2 à 33)
    • Dans les NTFS Boot Sectors
    • Dans la MFT (utiliser chkdsk)

    La structure GPT est très robuste en ceci que windows maintient une consistance entre les GPT Header de début et de fin, ainsi que dans les tables de partitions de début et de fin, de façon à ce que si quelqu’un vient à supprimer l’un d’eux, il sera réparé au moins au prochain reboot.

    La partie non protégée est le MBR (secteur 0) et c’est jusqu’à présent la seule corruption que j’ai eu à réparer sur des disques GPT Basiques.

    clip_image002

    Nous n’allons donc voir que deux types de corruption

    • MBR
    • Partition Table
    • NTFS : Déjà couvert dans les parties précédentes.

    Premier type de corruption (le seul déjà rencontré au support) : Vidage du MBR

    Voilà à quoi cela ressemble dans le gestionnaire de disque :

    clip_image004

    A l’éditeur hexa, on ne voit que des 00:

    clip_image006

    Le secteur 1 contient bien ce qui ressemble à un GPT Header

    clip_image008

    Ses données semblent correctes

    Signature : EFI PART

    Revision: 1.0

    Header Size : 92

    Header CRC: 2038912732

    Reserved1 : 0

    This LBA : 1

    Alternate LBA : 266338303

    First Usable LBA: 34

    Last Usable LBA : 266338270

    Partition Entry LBA: 2

    Partition Count : 128

    Partition Entry Size : 128

    Partition Array CRC : 1909465771

    Disk GUID : 51063D81-877B-4536-B69E-0958EDB891C2

    Si on ouvre le GPT Header alternative, on retrouve les mêmes données :

    Si on parcours la table de partition (LBA 2) on trouve une table de partition contenant la MSR et 3 partitions de données. Dans mon cas, je n’ai que 3 partitions sur mon disque donc, les autres LBAs (jusqu’au 33) sont vides.

    clip_image010

    On peut reporter les données dans ce tableau (pour l’interprétation, se référer au chapitre précédent)

     

    Partition 1

    Partition 2

    Partition 3

    Partition 4

    Partition Type

    E3C9E326-0B5C-4DB8-817D-F92DF00215AE

    EBD0A0A2-B9E5-4433-47C0-68B6B72699C7

    EBD0A0A2-B9E5-4433-47C0-68B6B72699C7

    EBD0A0A2-B9E5-4433-47C0-68B6B72699C7

    Partition GUID

    18516D6A-C900-4A25-888C-E27974E44EAA

    0DC137A4-CEFF-48ED-8EF8-E08282AA555B

    32781219-85A3-470B-A075-DBD480A9D685

    3D0A2A5F-8F8A-43B6-B859-8EA9930DCBE6

    Starting LBA

    34

    264192

    184416256

    245854208

    Attribute Flags

    0

    0

    0

    0

    Ending LBA

    262177

    184416255

    245854207

    266334207

    Partition Name

    Microsoft reserved partition

    Basic data partition

    Basic data partition

    Basic data partition

    Dans le cadre d’une réparation, il faut bien vérifier que les secteurs 264192/184416255 , 184416256/245854207 et 245854208/266334207 sont des secteurs NTFS et contrôler qu’ils pointent bien vers une MFT a priori correcte. (nous avons traité ces points dans les articles précédents)

    Donc:

    • Les "GPT Header" principal et secondaire sont Ok
    • Les "GPT Entries" des "Partition Table" principale et secondaire sont Ok
    • Les structures NTFS sont Ok

    Seul le MBR est à reconstruire

    Il ne nous reste plus qu’à réparer le MBR en se souvenant qu’ils sont tous identiques.

    Partition table entry

     

    Start head : 0

    End head : FF (255)

    Start sector : 2

    End Sector : 3F (63)

    Start Cylinder : 0

    End Cylinder : 3FF (1023)

    Relative Sector : 1

    Total Sectors : FFFFFFFF (4294967295)

    Partition Type : EE (GPT)

    Magic number : 55 AA

    En utilisant un éditeur hexa il reste à écrire ces données :

    clip_image012

    Et c’est tout. Un rescan du disque et on n’en parle plus.

    Serge Gourraud
    55 AA

  • Récupération de disques VII : Structures des disques GPT Basic

    Maintenant que les disques basiques MBR (partitions primaires et étendues) n’ont plus de secrets pour nous, nous allons nous intéresser au disques basiques GPT.

    Reprenons le schéma qui décrit la structure d’un disque basique GPT et essayons de voir à quoi cela ressemble concrètement.

    clip_image002

    Commençons par le secteur 0:

    clip_image004

    Remarques:

    • Il n’y a plus de signature. Nous n’en avons plus besoin car nous identifions désormais le disque par GUID, et cette information sera stockée ailleurs.
    • Il n’y a qu’une seule entrée dans la table de partition, et ses propriétés sont telles que tout le disque est occupé.

    Partition table entry

     

    Start head : 0

    End head : FF (255)

    Start sector : 2

    End Sector : 3F (63)

    Start Cylinder : 0

    End Cylinder : 3FF (1023)

    Relative Sector : 1

    Total Sectors : FFFFFFFF (4294967295)

    Partition Type : EE (GPT)

     

    Le MBR est dit “protecteur” car il contient une partition qui couvre tout le disque (Relative Sector 1 / Total Sectors FFFFFFFF), et aussi car nous avons des secteurs importants

    Voici ce à quoi ressemble le secteur 1 : 

    clip_image006

    Ce secteur est le GPT Header et contient ces informations :

    Partition

    Offset

    Size

    Sample value

    Meaning

    Sector Signature

    0

    8 bytes

    "EFI PART"

     

    Version

    8

    4 bytes

    00 00 01 00

    0.1

    Header size

    C

    4 bytes

    5C 00 00 00

    5C

    CRC32 of the header

    10

    4 bytes

    0D 2C 34 EA

    3929287693

    Reserved

    14

    4 bytes

    0

    0

    Current GPT Header Address

    18

    8 bytes

    01 00 00 00 00 00 00 00

    1

    Backup GPT Header Address

    20

    8 bytes

    FF FF DF 0F 00 00 00 00

    266338303

    First usable LBA

    28

    8 bytes

    22 00 00 00 00 00 00 00

    34

    Last usable LBA

    30

    8 bytes

    DE FF DF 0F 00 00 00 00

    266338270

    Disk GUID

    38

    16 bytes

    85 A1 7E 9C 2D 05 3B 4A AC DD D1 FF 8F 7B 22 4A

    9C7EA185-052D-4A3B-ACDD-D1FF8F7B224A

    Partition Table Address

    48

    8 bytes

    02 00 00 00 00 00 00 00

    2

    Partition Count

    50

    4 bytes

    80 00 00 00

    128

    Partition Table Entry Size

    54

    4 bytes

    80 00 00 00

    128

    CRC32 of partition table

    58

    4 bytes

    3E C0 26 26

    640073790

    Toutes les données sont importantes, mais celles qui nous intéressent pour faire des réparations sont :

    • La signature ("EFI PART") : Pour reconnaitre le secteur (nous n’avons plus de 55 AA)
    • Les CRC32 : Ceux-ci sont importants car ils permettent au système de vérifier que quelqu’un n’a pas modifié des entrées dans ses tables à la main, en by-passant le système.
    • L’adresse courante du header (1) et l’adresse du GPT Header alternatif (266338303)
    • Le début de la table de partition (2) et le nombre de partition qu’elle peut contenir (128)
    • Les 1ers et derniers secteurs utilisables (en général le dernier +1 contient le début de la table de partitions
    • Un GUID qui représente le disque (sa signature)

    Cette structure est décrite sur http://msdn.microsoft.com/en-us/library/windows/desktop/aa365449(v=vs.85).aspx

    Regardons le secteur 2 : Début de la table de partition.

    clip_image008

    Il faut y voir 4 régions de 128 bytes chacune : Une entrée dans la table de partition fait 128 bytes

    Dans le cas présent, les 2 premières entrées sont occupées et les autres sont vides

    Première entrée

    Partition Table Entry

    Offset

    Size

    Sample value

    Meaning

    Partition Type

    0

    16 bytes

    16 E3 C9 E3 5C 0B B8 4D 81 7D F9 2D F0 02 15 AE

    E3C9E316-0B5C-4DB8-817D-F92DF00215AE

    Partition GUID

    10

    16 bytes

    7C C6 D3 BB F9 D2 5F 42 9F 2C 7D CF 1F 1D 8B E5

    BBD3C67C-D2F9-425F-9F2C-7DCF1F1D8BE5

    Starting LBA

    20

    8 bytes

    22 00 00 00 00 00 00 00

    34

    Ending LBA

    28

    8 bytes

    21 00 04 00 00 00 00 00

    262177

    Attribute flags

    30

    8 bytes

    00 00 00 00 00 00 00 00

    0

    Partition Name

    38

    72 bytes

    … too long…

    Microsoft Reserved Partition

    Seconde entrée

    Partition Table Entry

    Offset

    Size

    Sample value

    Meaning

    Partition Type

    80+0

    16 bytes

    A2 A0 D0 EB E5 B9 33 44 87 C0 68 B6 B7 26 99 C7

    EBD0A0A2-B9E5-4433-47C0-68B6B72699C7

    Partition GUID

    80+10

    16 bytes

    BE 9C FD 21 F3 E8 40 49 8C C2 57 30 0A A8 1E B6

    21FD9CBE-E8F3-4940-8CC2-57300AA81EB6

    Starting LBA

    80+20

    8 bytes

    00 08 04 00 00 00 00 00

    264192

    Ending LBA

    80+28

    8 bytes

    FF F7 DF 0F 00 00 00 00

    266336255

    Attribute flags

    80+30

    8 bytes

    00 00 00 00 00 00 00 00

    0

    Partition Name

    80+38

    72 bytes

    … too long…

    Basic data partition

    Vous pourrez trouver des informations complémentaires sur ces structures dans l’article http://msdn.microsoft.com/en-us/library/windows/desktop/aa365449(v=vs.85).aspx

    Plus d’informations sur la Microsoft Data Partition (MSR) dans la FAQ GPT:

    http://msdn.microsoft.com/en-us/library/windows/hardware/dn640535(v=vs.85).aspx#gpt_faq_what_is_msr

    Donc, la première entrée est pour la MSR et la seconde pour la partition de données de type « Basic Data Partition ».

    Puisqu’il s’agit d’une partition NTFS, nous pouvons trouver les NTFS Boot Sectors aux LBA 264192 et 266336255

    Et voilà:

    clip_image010

    On peut y lire:

    Déjà on retrouve notre signature 55 AA (qui commençait à manquer un des mes amis blogueurs)

    • Le Relative Sector : 00 08 04 00 --> 00 04 08 00 = 40800 = 264192 LBA
    • Total Sectors: FF EF DB 0F 00 00 00 00 --> FDBEFFF = 266072063 Secteurs

    Le NTFS Boot sector de backup montrera la même information.

    Le GPT Header nous avait parlé du Last Usable LBA (266338270)

    Le LBA juste après montre bien une copie de la table de partition (266338270 + 1 = 266338271 )

    clip_image012

    Un espace de 128 entrées (si on en prend 4 par secteur de 512 ça fait 32 secteurs) est reservé pour y stocker toute la table de partitions

    Les angoissés qui aiment que tout soit bien aligné éprouveront sans doute un plaisir non caché en constatant que 26638271 + 32 = 266338303 : C’est exactement l’emplacement du GPT Header alternatif.

    C’est vrai que c’est rassurant quand même … quelque part … moi, je trouve ça rassurant.

    clip_image014

    Comme on adore les schémas qui montre la beauté de l’alignement des secteurs, en voici un qui reprend les valeurs que nous avons trouvées.

    clip_image016

    Voilà, vous savez désormais tout sur la façon dont les partitions sont référencées dans des disques GPT. Dans le prochain article, nous allons voir où peuvent se glisser des corruptions et comment les réparer (ou pas).

    Serge Gourraud
    55 AA

  • Récupération de partitions VI - Un peu plus loin dans la détection des partitions

    Supposons maintenant que ce disque qui contient ces 3 partitions :

    clip_image002

    Se soit transformé en ceci:

    clip_image004

    Ce sont des choses qui arrivent quand le MBR (secteur 0 du disque) a été vidé.

    Rappelons la structure d’un disque contenant 3 partitions et essayons de voir ce qu’on a concrètement sur le disque

    clip_image006

    Le secteur 0 est vide: Pas de signature, pas de code, pas de table de partitions

    clip_image008

    Sur des disques MBR Basiques c’est au secteur 2048 que démarre la première partition (sur les anciennes architectures, on aurait cherché au secteur 63 voire 31 mais ça nous ramené à NT4.0)

    Le secteur 2048 nous montre ceci :

    clip_image010

    Et nous pouvons y lire ces informations :

    • OEM ID (offset 30) : NTFS
    • Bytes per Sector (offset 0B) : 00 02 -> 512
    • Sectors per cluster (offset 0D) : 08
    • Cluster per MFT Record (offset 40) : F6 -> 1K
    • Total Sectors (offset 28) : FF 67 C5 09 00 00 00 00 -> 163932159 sectors (~78GB
      • Backup NTFS Boot Sector = 163932159 + 2048 = 163934207
    • Clusters to MFT (offset 30) : 00 00 0C 00 00 00 00 00 -> 78643
      • La partition démarrant en 2048 : on trouvera la MFT en 2048 + 8 * 786432 = 629350
    • Clusters to MFTMirr (offset 38) : 02 00 00 00 00 00 00 00 -> 2
      • 2048 + 8 * 2 = 2064

    Pour résumer :

    • Le dernier secteur de la partition devrait se trouver en 163934207
    • La MFT en 786432 (et son "backup" en 2064
    • Le champ $Volume en 6293510 ( = 6293504 + 2*3)

    Le NTFS Boot Sector de backup en 163934207

    clip_image012

    Le secteur 786432 ressemble à un début de MFT

    clip_image014

    Et visiblement, on retrouve le nom du volume

    clip_image016

    Nous savons désormais que notre première partition démarre au secteur 2048 et finit au secteur 163934207

    Comme tout est aligné, la seconde partition devrait démarrer au secteur 163934207 + 1 = 163934208

    Fantastique!

    clip_image018

    On peut également y lire:

    • OEMID (offset 30) : NTFS
    • Bytes per Sector (offset 0B) : 00 02 -> 512
    • Sectors per cluster (offset 0D) : 08
    • Cluster per MFT Record (offset 40) : F6 -> 1 record MFT = 1K
    • Total Sectors (offset 28) : FF 7F A9 03 00 00 00 00 : 61439999 sectors (~29 GB)
      • Backup NTFS Boot Sector : 61439999 + 163934208 = 225374207
    • Clusters to MFT (offset 30) : 00 00 0C 00 00 00 00 00 : 786432 -> 163934208 + 8 * 786432 = 170225664
    • Clusters to MFTMirr (offset 38) : 02 00 00 00 00 00 00 00 : 2 -> 163934208 + 8 * 2 = 163934224

    De même, la 3ième partition sensé démarrer un secteur plus loin y est bien présente :

    225374207 + 1 = 225374208

    clip_image020

    Total sectors: 0270FFFF = 40959999 = 40959999 *512 = 20971519488 Bytes

    Backup Boot Sector : 40959999 + 225374208 = 266334207

    Il faudra faire un contrôle complet de chaque secteur important (NTFS / Backup NTFS / MFTMirr / MFT / MFT.$Volume) et on peut dresser cette carte du disque :

    • Première Partition :
      • Nom du volume Part1
      • Taille en secteurs: 163932159
      • Démarre au secteur: 2048
      • MFT localisée au secteur: 6293504
      • Termine au secteur: 16393420
    • Deuxième Partition :
      • Nom du volume: Part2
      • Taille en secteurs: 61439999
      • Démarre au secteur: 163934208
      • MFT localisée au secteur: 170225664
      • Termine au secteur: 225374207
    • Troisième Partition :
      • Nom du volume: Part3
      • Taille en secteurs: 40959999
      • Démarre au secteur: 225374208
      • MFT localisée au secteur: 231665664
      • Termine au secteur: 266334207

    Il est très important de tout bien verifier: Si vous faites une erreur d’un secteur et que votre partition ne trouve pas sa MFT, notre  vieil ami chkdsk se fera un plaisir d’un générer automatiquement une toute nouvelle MFT, tout vide, juste pour vous. 

    Et nous pouvons démarrer notre réparation

    Première étape: Initialiser le disque (le code, la signature et une table de partition vide seront écrites)

    clip_image022

    Maintenant, il nous faut reprendre notre éditeur hexa préféré, le mien s’appelle DskProbe.exe car il permet d’appliquer un masque au données affichés par les secteurs.

    (Pour information ce lien http://fr.wikipedia.org/wiki/%C3%89diteur_hexad%C3%A9cimalpropose une liste de produits)

    Le secteur 0 que nous venons de réécrire (par initialisation) ressemble désormais à cela :

    clip_image024

    Avec DskProbe, nous pouvons faire paraitre la table de partition de ce secteur.

    Les valeurs de début et fin de Head (=Side), Secteur et Cylindre dépendent de l’architecture, mais sont souvent les mêmes et voici celle qui convient de mettre pour la première partition de notre disque.

    (Si vous avez plusieurs disques identiques sur votre ordinateur, ou un autre ordinateur avec le même disque qui n’a pas eu de soucis, vous pouvez récupérer les mêmes données)

    clip_image026

    Note : Il faut ajouter un secteur au Total Sectors du MBR par rapport au Total Sectors du NTFS Boot Sector puisqu’à cet endroit il faut compter les deux NTFS Boot Sector qui encadrent la partition, alors que dans le NTFS Boot Sector, on ne compte pas le dernier.

    En récrivant « 07 » à l’offset du FileSystem de la première entrée de la table de partition.

    Un rescan disk dans le Disk Manager nous fait reparaitre la partition comme par miracle:

    clip_image028

    On peut faire reparaitre les deux autres partitions en remplissant mes Start/End Side/Sector/Cylinder comme suit, et en adaptant les Relative et Total Sectors aux données relevées et en plaçant le type de système à NTFS (07) aux offset 01C2, 01D2, 01E2, 01F2 correspondant aux partitions respectives.

    clip_image030

    clip_image032

    Si une des partitions par en chdksk, pas de chances : Soit vous vous êtes trompés dans vos calculs, soit la MFT avait besoin d’une réparation avant vos opérations.

    Comme expliqué au premier article, toutes ces opérations sont des opérations de dernier recours, et ne garantissent aucunement la récupération de vos données.

    Dans la prochaine série, nous nous intéressons aux disques GPT.

    Serge Gourraud
    55 AA