Changer la lettre d'un lecteur amovible

L'article explore divers moyens de modifier la lettre d'un lecteur. Ceux qui ne sont pas intéressés par les approches en lignes de commandes peuvent consulter directement les passages portant sur USB Drive Letter Manager ou ChangeVolumeDriveLetter, programmes qui, j'en suis sûr, retiendront leur attention.

Lorsque l'on connecte un volume amovible, la lettre choisie par le système pour ce lecteur ne convient pas toujours. Nous avons fait des raccourcis, nous utilisons des programmes qui utilisent le lecteur, nous avons nos habitudes, et voilà que le disque externe consacré aux Sauvegardes ne veut plus être en S.

Remarque :
Une réponse simple à ce problème est d'utiliser un batch situé sur la clé USB, on n'a ainsi plus à se soucier de la lettre attribuée par Windows au volume amovible. Il suffit de ne pas préciser la lettre du volume de destination dans les commandes. Cette astuce sera amplement utilisée dans notre tuto. Voici un exemple avec Robocopy qui copie en miroir un dossier du disque dur sur le volume contenant le batch (le dossier "lasauvegarde" est créé s'il n'existe pas) :

robocopy c:\mondossier lasauvegarde\ /MIR /FFT /XJ
pause

Exemple avec xcopy (pour varier j'ai utilisé ".\" qui représente le lecteur en cours, mais ça marche aussi sans, comme ci-dessus) :

xcopy d:\mondossier .\masauvegarde\ /e /h /c /y /i
pause

Heureusement, Windows permet de rectifier le tir. Ça se corrige classiquement avec le Gestionnaire de Disques. Oui mais j'aimerais bien que ce soit automatique nous dit ce sympathique lecteur de Carpentras. Je vous invite à faire le tour des possibilités, puis, et surtout, à découvrir USB Drive Letter Manager. Un must ! La dernière partie de l'article aborde le sujet des liens relatifs à un même support.

 

 

Gestionnaire de disques

Aide et Support expose une méthode avec DISKPART et une méthode avec le Gestionnaire de Disques diskmgmt.msc; taper les mots lettre et lecteur dans la case du module de recherche de Aide et Support (WIN+F1) pour en savoir plus. Les plus motivés seront intéressés par cette documentation Microsoft : How Basic Disks and Volumes Work

Première méthode, utiliser le gestionnaire de disques.
Pour le trouver, faire un clic droit sur le Poste de Travail, Gérer.
Dans la Console de Gestion de l'ordinateur, descendre à Gestion des disques.
Pour changer la lettre d'un lecteur faire un clic droit sur le volume, le Menu Contextuel propose diverses options dont "Modifier la lettre de lecteur et les chemins d'accès".
Seules les lettres encore disponibles sont proposées.
Qu'un lecteur ait une lettre ou non, il peut être associé à un dossier. Cette notion de Point de montage va être abordée plus loin.

La commande diskmgmt.msc permet d'accéder directement au gestionnaire :
Démarrer>Exécuter>diskmgmt.msc

On peut :
Attribuer une lettre, Modifier la lettre d'un Volume, ou encore monter un lecteur dans un dossier :

       

Monter un volume dans un dossier NTFS vide est également possible en ligne de commandes avec mountvol. Le nom évoqué dans l'aide en ligne de cette commande est "Point de montage". Cette technique permet de contourner la limitation en lettres disponibles. Nous allons voir plus bas les possibilités de la commande MOUNTVOL. La commande subst se contente d'affecter une lettre de lecteur à un chemin de dossier en créant un alias. La commande Junction crée des Points de Jonction, appelés également Liens Symboliques.

Astuce : la lettre B est disponible la plupart du temps.

On va passer à plus amusant : changer la lettre d'un volume amovible en lignes de commandes :

 

Utilisation de la commande DISKPART

Rappel : ceci est une étude. Diskpart n'est pas la meilleure méthode. Continuez à lire !

Avant de passer à la présentation d'USB Drive Letter Manager, voici, avec toutes les réserves d'usages, quelques commandes permettant de changer les lettres de lecteurs. Ces batchs sont destinés à être utilisés depuis le lecteur amovible dont on désire changer la lettre.

En cherchant les mots lettre et lecteur dans Aide et Support on trouve ce chapitre : Affecter, modifier ou supprimer une lettre de lecteur. La première solution a été vue plus haut. La seconde solution est Utilisation d'une ligne de commande. La commande proposée est DISKPART. La vue suivante montre comment on peut modifier la lettre d'un lecteur en quelques lignes de commandes avec DISKPART :

Soit une clé USB positionnée en B:\ à laquelle on doit attribuer la lettre X

EXIT pour quitter le prompt DISKPART>
Si on essaie de prendre une lettre déjà occupée, la modification est refusée.
Si on essaie avec la même lettre (B) il ne se passe rien.
Plus d'aide sur DISKPART :

Remarque :

 

AssignNewLetter.cmd

Rappel : ceci est une étude. Diskpart n'est pas la meilleure méthode. Continuez à lire !

Coller les commandes ci-dessous dans un fichier Bloc-Notes, puis sauvegarder sous le nom AssignNewLetter.cmd sur la clé ou le disque USB pour qu'il soit toujours à disposition. Ce Batch extrait la lettre du lecteur sur lequel il se trouve pour la modifier. Il fonctionnera donc sur un autre PC sur lequel on connecte le volume. 

:AssignNewLetter.cmd
@echo off
color 1F
set volume=%~d0
echo.
set letter=%volume:~0,1%
echo Ce volume a la lettre = %letter% =
set /p NewLetter=Quelle est la nouvelle lettre a attribuer au lecteur ?
echo.
echo Vous avez choisi la lettre : %NewLetter%
echo.
if %NewLetter%=="" exit
if /i %NewLetter%==%letter% goto :sameletter
if exist %NewLetter%: goto :exist
echo rescan > %temp%\drive.log
echo select volume %volume%>> %temp%\drive.log
echo assign letter=%NewLetter%>> %temp%\drive.log
echo exit>> %temp%\drive.log
diskpart -s %temp%\drive.log
del %temp%\drive.log
if exist %NewLetter%: mountvol %volume% /d
@pause
goto :eof
:sameletter
echo Ce lecteur a deja la lettre %letter%
@pause
goto :eof
:exist
echo %NewLetter%: n'est pas libre
@pause

 


 

EXEMPLE DE FONCTIONNEMENT


X:\>AssignNewLetter.cmd

Ce volume a la lettre = X =
Quelle est la nouvelle lettre a attribuer au lecteur ?X

Vous avez choisi la lettre : X

Ce lecteur a deja la lettre X
Appuyez sur une touche pour continuer...

X:\>AssignNewLetter.cmd

Ce volume a la lettre = X =
Quelle est la nouvelle lettre a attribuer au lecteur ?C

Vous avez choisi la lettre : C

C: n'est pas libre
Appuyez sur une touche pour continuer...

X:\>AssignNewLetter.cmd

Ce volume a la lettre = X =
Quelle est la nouvelle lettre a attribuer au lecteur ?B

Vous avez choisi la lettre : B


Microsoft DiskPart version 5.1.3565

Copyright (C) 1999-2003 Microsoft Corporation.
Sur l'ordinateur : FSPSA

Veuillez patienter pendant que DiskPart analyse votre configuration...
..........
DiskPart a fini d'analyser votre configuration.

Le volume 12 est le volume sélectionné.

DiskPart a assigné la lettre de lecteur, mais votre ordinateur doit être redémarré
pour que les modifications prennent effet.

Quitte DiskPart...
Le chemin d'accès spécifié est introuvable.

X:\>

En réalité le lecteur est utilisable immédiatement avec sa nouvelle lettre.
Le message "Le chemin d'accès est introuvable" est dû au fait que X:\ a été démonté par la commande mountvol %volume% /d
Cette variante attribue la lettre B en un clic :

Rappel : ceci est une étude. Diskpart n'est pas la meilleure méthode. Continuez à lire !

@set letter=B
:::::::::::::
@echo off
color 1F
set volume=%~d0
if /i %letter%==%volume:~0,1% goto :sameletter
echo DRIVE = %volume%
echo rescan > %temp%\drive.log
echo select volume %volume%>> %temp%\drive.log
echo assign letter=%letter%>> %temp%\drive.log
echo exit>> %temp%\drive.log
diskpart -s %temp%\drive.log
del %temp%\drive.log
if exist %letter%: mountvol %volume% /d
goto :eof
:sameletter
echo LETTRE ACTUELLE = %volume:~0,1%
echo LETTRE DEMANDEE = %letter% ???
pause

Si la lettre B est occupée, la modification est refusée.
On pourra retirer la commande pause utilisée pour la mise au point.

 

 

Utilisation de la commande MOUNTVOL

Lire Aide et Support :
Démarrer>Exécuter>hh ntcmds.chm::/mountvol.htm
Crée, supprime ou répertorie le point de montage d'un volume. Mountvol permet de lier des volumes sans avoir recours à une lettre de lecteur :

À l'utilisation la méthode DiskPart apparaît très lente. En jonglant un peu il est possible de s'en passer pour n'utiliser que la commande MountVol. Voici son fonctionnement :

B:\>mountvol b: /L
\\?\Volume{5ec2f28c-cc92-11db-a382-00138ffbb911}\

B:\>mountvol b: /D

B:\>mountvol x: \\?\Volume{5ec2f28c-cc92-11db-a382-00138ffbb911}\
Le répertoire en cours n'est pas valide.

B:\>x:
Le lecteur spécifié est introuvable.

B:\>e:

E:\>mountvol x: \\?\Volume{5ec2f28c-cc92-11db-a382-00138ffbb911}\

E:\>x:

X:\>

En première approche mountvol sans argument ni commutateurs affiche l'aide suivie de la liste des lecteurs et de leurs GUID. Pour limiter au lecteur qui nous intéresse on utilise, dans la première commande, le commutateur /L pour obtenir le numéro d'identification du lecteur B:\
\\?\Volume{5ec2f28c-cc92-11db-a382-00138ffbb911}\

Les GUID sont conservés dans cette clé du Registre :

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2

La commande suivante démonte le volume B:\ ==> mountvol b: /D

On note que la tentative de monter directement le volume X:\ se solde par le message "Le répertoire en cours n'est pas valide" et X:\ n'existe pas, il n'a pas été monté. Pour contourner cette difficulté il faut tout simplement se positionner sur un lecteur valide, ici E:\

La commande mountvol x: avec pour argument l'identification du volume amovible est alors un succès.

Ces particularités vont compliquer singulièrement le batch situé sur la clé USB. Il faudra créer un second batch externe au volume, lequel produira à son tour un fichier dans lequel il ira lire le CLSID du lecteur. Ces fichiers temporaires devront être supprimés en fin de traitement.

 

AssignNewLetter.cmd


Dans cette nouvelle version de AssignNewLetter.cmd deux fichiers externes sont créés dans le Temporaire (variable d'environnement %TEMP%). Tmp.txt est nécessaire pour stocker le CLSID qui sera récupéré ensuite par la commande FOR. C'est tmp.cmd qui créera tmp.txt et réalisera les opérations de changement de lettre :
 
@echo off
color 1F
set volume=%~d0
set letter=%volume:~0,1%
echo.
echo Ce volume a la lettre = %letter% =
set /p NewLetter=Quelle est la nouvelle lettre a attribuer au lecteur ?
echo.
echo Vous avez choisi la lettre : %NewLetter%
echo.
if %NewLetter%=="" exit
if /i %NewLetter%==%letter% goto :sameletter
if exist %NewLetter%: goto :exist

set tp=%temp%\tmp.cmd
set tx=%temp%\tmp.txt
>%tp% echo mountvol %volume% /L^>%tx%
>>%tp% echo mountvol %volume% /D
>>%tp% echo for /f %%%%A in (%tx%) do set lecteur=%%%%A
>>%tp% echo mountvol %NewLetter%: %%lecteur%%
>>%tp% echo del %tx%
>>%tp% echo del %tp%
cd /d %temp%
%tp%

if exist %NewLetter%: mountvol %volume% /d
@pause
goto :eof
:sameletter
echo Ce lecteur a deja la lettre %letter%
@pause
goto :eof
:exist
echo %NewLetter%: n'est pas libre
@pause

 

Plusieurs techniques ont été utilisées :

 

Assign-B.cmd

Cette variante très pratique donne en un clic la lettre B au lecteur depuis lequel il est lancé.
La lettre B est en effet toujours disponible ou presque, la clef USB ou le disque amovible est ainsi placé en tête dans Poste de Travail.
Plus de question à se poser, si on veut accéder à la clef, à tout moment : WIN+R,b:
Voici le contenu de assign-b.cmd :

@echo off
:::::::::::::::
set NewLetter=B
:::::::::::::::
set volume=%~d0
if /i %NewLetter%==%volume:~0,1% goto :sameletter
if exist %NewLetter%: goto :exist
set tp=%temp%\tmp.cmd
set tx=%temp%\tmp.txt
>%tp% echo mountvol %volume% /L^>%tx%
>>%tp% echo mountvol %volume% /D
>>%tp% echo for /f %%%%A in (%tx%) do set lecteur=%%%%A
>>%tp% echo mountvol %NewLetter%: %%lecteur%%
>>%tp% echo del %tx%
>>%tp% echo del %tp%
cd /d %temp%
%tp%
exit

:sameletter
echo LETTRE ACTUELLE = %volume:~0,1%
echo LETTRE DEMANDEE = %NewLetter% ???
pause
exit

:exist
echo %NewLetter%: n'est pas libre
pause
exit

 

La modification de la lettre est à présent très rapide. Si le Poste de Travail est ouvert, on voit le lecteur changer de place. Il y a peu d'aide sur la commande MountVol, il faut chercher des exemples pour apprendre à l'utiliser. J'ajoute cet autre exemple.
Il est également possible d'utiliser des scripts VBS : Change the Drive Letter of a Volume.

 

Assign-U.cmd

Si utiliser la lettre A ou B présente certains avantages, cela se révèle un handicap lorsque l'on utilise certains programmes pour lesquels les auteurs ne semblent pas avoir prévu cela. J'ai en effet noté que unetbootin par exemple ne détectait pas la clé USB montée en B. Quoiqu'il suffise de cocher "Show All Drives" cette situation est regrettable. J'ai donc le plaisir de proposer une variante qui donne la lettre U à la clé USB : assign-u.cmd

Après ces indigestes lignes de commandes, voici beaucoup plus léger : le très pratique et utile USB Drive Letter Manager :

 

 

 

USB Drive Letter Manager

USBDLM est une perle :
USB Drive Letter Manager for Windows 2000, XP, Server 2003 and Vista
Control USB Drive Letter Assignment in Windows XP/2003/Vista/2008
Il s'installe comme un Service (USBDLM) et agit lors de la connexion d'un volume externe USB, que ce soit une clé ou un disque. Selon les critères définis par l'utilisateur dans le fichier USBDLM.INI, il attribue alors une lettre au volume. L'utilisateur doit éditer le fichier USBDLM.INI (cliquer sur le fichier pour l'ouvrir dans Bloc-Notes). Il est dans le dossier d'installation du programme. On y trouve également un exemple, USBDLM_sample.ini, et une aide, USBDLM_eng.chm :

%ProgramFiles%\USBDLM\USBDLM.INI
%ProgramFiles%\USBDLM\USBDLM_sample.ini
%ProgramFiles%\USBDLM\USBDLM_eng.chm

Informations et téléchargement
www.uwe-sieber.de/english.html
www.uwe-sieber.de/usbdlm_e.html
www.uwe-sieber.de/usbdlm_help_e.html

TUTO
http://trac.ogsteam.fr/blog/category/usb

Extraits d'un USBDLM.INI :

Pour que seules les lettres B, Q, et de U jusqu'à Z, soient disponibles pour les lecteurs amovibles :

[DriveLetters]
Letters=B,Q,U-Z

Pour que la présence d'un fichier nommé drive_Q.id sur la racine de la clé suffise à lui faire attribuer la lettre Q :

[DriveLetters10]
BusType1=USB
BusType2=FireWire
BusType3=SCSI
FileExists=%Drive%\drive_Q.id
Letter1=Q

Pour que le nom du volume décide de sa lettre :

[DriveLetters20]
VolumeLabel1=Quebec
Letter1=Q

[DriveLetters30]
VolumeLabel1=Whisky
Letter1=W

 

Identifier les lecteurs amovibles avec USBDLM\ListUsbDrives.exe

Source : Tips for USB pen drives, Safe Removal, Reactivate an USB Drive sur le site de l'auteur de USBDLM
ListUsbDrives.exe est présent dans le dossier d'installation d'USBDLM. On peut l'utiliser directement après décompression de usbdlm.zip et le copier sur la clé USB :

ListUsbDrives.exe identifie les volumes USB connectés. La ligne Ctrl DevID révèle l'ID du volume :

Connaissant l'ID d'un volume amovible, celui-ci devient manipulable avec la commande DEVCON, par exemple pour réactiver une clé USB "éjectée" sans avoir à la débrancher et rebrancher physiquement. 

Rappel : le Gestionnaire de périphériques permet de connaître les numéros d'identification d'un matériel (Propriétés, onglet Détails).

Réactiver une clé USB éjectée

Petit préambule : Administrateur ou pas ?
Agir sur des périphériques nécessite d'être administrateur. Pour adapter les méthodes ci-dessous afin qu'elles soient utilisables depuis un compte sans pouvoir (compte Standard pour Vista et W7, appelé compte Limité sur XP), on peut utiliser la commande runas. L'utilitaire ShellRunAs est plus agréable à l'usage. Il existe aussi nircmd elevate. Si on veut ne pas avoir à entrer le mot de passe, le script xrunas.vbs exécute la commande runas en joignant le mot de passe, il suffira d'utiliser un raccourci avec la commande. Si on utilise cette solution, être conscient de la baisse de sécurité dû au fait que le mot de passe est en clair dans le raccourci. Mais il est possible de compiler / crypter un script. Une excellente solution existe avec cpau qui peut crypter la commande. Astuce : démarrer une Console CMD en tant qu'administrateur. Les commandes entrées dans cette Console seront effectuées sous ce compte, c'est vérifiable dans le gestionnaire de tâches. Le compte Administrateur prédéfini est utilisable s'il a un mot de passe : images 1, 2.

Source : Tips for USB pen drives, Safe Removal, Reactivate an USB Drive sur le site de l'auteur de USBDLM
Discussion : Faire apparaître la clé USB dans l'explorateur
Cette démarche tient à l'accessibilité, les prises usb étant souvent d'accès peu aisé. On désire réaccéder au contenu d'une clé restée physiquement connectée alors qu'on a utilisé la fonction "Éjecter" du menu contextuel de l'explorateur de fichiers ou l'icone "Retirer le périphérique en toute sécurité" de la Zone de Notification sur la droite de la Barre des Tâches, ou bien même un outil comme EjectUSB.exe
On a vu ci-dessus comment avec ListUsbDrives on pouvait identifier les volumes amovibles.
Ma clé USB est montée avec la lettre B:\ (MountPoint). Son label est BRAVO. Son ID est :
Ctrl DevID   = USB\VID_0204&PID_6025\6&36F05019&0&3

Connaissant l'ID du périphérique, on utilise l'utilitaire en lignes de commandes DEVCON :
http://support.microsoft.com/kb/311272/fr
http://makemsi-manual.dennisbareis.com/devcon_exe.htm
http://www.hotline-pc.org/gestionnairedeperipheriques.htm#0501
Remarques :
- Si devcon fonctionne mal (Disable failed) avec Windows en 64 bits c'est parce qu'il faut utiliser l'une des versions 64 bits.
  Pour ma part c'est la version du dossier amd64 qui fonctionne.
- Copier devcon.exe dans le dossier Windows, il n'y aura ainsi pas à préciser de chemin lors de son utilisation : devcon enable usb\vid_0204*
  Après installation du WinDDK devcon est par là : %programfiles%\WinDDK\7600.16385.1\Tools\devcon\

Après avoir testé les commandes devcon disable usb\vid_0204* et devcon enable usb\vid_0204* comme suggéré dans l'article cité en source, ça avait l'air de fonctionner. Mais ça ne marchait pas si on passait par une "éjection" propre de la clé. En lisant bien l'article, l'auteur signale l'inconvénient, et explique qu'il faut utiliser un HUB. Ceci m'a orienté vers un redémarrage de l'ensemble des équipements HUB de la carte mère. Après quelques essais il est apparu que seul le redémarrage des USB\VID était nécessaire.

Ceci fonctionne quelle que soit la méthode utilisée pour "éjecter" la clé et a l'avantage de ne plus avoir à l'identifier préalablement :

F:\>devcon restart usb\vid*
USB\VID_04F9&PID_0006\5&290E3BD8&1&1 : Restarted
USB\VID_05AF&PID_3062&MI_00\6&31234760&0&0000 : Restarted
USB\VID_05AF&PID_3062&MI_01\6&31234760&0&0001 : Restarted
USB\VID_046D&PID_C526&MI_00\6&188E6362&0&0000 : Restarted
USB\VID_046D&PID_C526&MI_01\6&188E6362&0&0001 : Restarted
USB\VID_05AF&PID_3062\5&14647C1B&1&2 : Restarted
USB\VID_0409&PID_005A\5&341563D&1&5 : Restarted
USB\VID_046D&PID_C526\5&25C3331&1&1 : Restarted
USB\VID_0204&PID_6025\6&A0B590C&0&3 : Requires reboot
The 9 device(s) are ready to be restarted. To restart the devices, reboot the system.

F:\>

Malgré l'affichage de "Requires reboot" la clé est bien redétectée et le système propose l'ouverture de son contenu. L'examen du gestionnaire de périphériques devmgmt.msc ne révèle pas de manque. Le batch à créer est simplissime (à exécuter en tant qu'admin ou avec l'UAC désactivé) :

devcon restart usb\vid*
pause

La commande pause permet de lire le contenu de la console avant de la refermer.
Finalement j'ai déterminé que la commande devcon restart usb\vid_0409* détecte mes deux clés USB situées en face avant. Je suppose que cette commande redémarre la partie commune aux deux prises, ce que confirme l'examen du registre ci-dessous. Comme ce sont les connexions en face avant qui me servent principalement pour les clés, il ne m'est pas nécessaire de faire plus. Le temps d'exécution est faible puisqu'on ne redémarre qu'un seul périphérique.

devcon restart usb\vid_0409*

Si ça ne marche pas, essayer avec devcon restart usb*
Ou ajouter au batch une ligne devcon restart usb\root_hub* :

devcon restart usb\vid*
devcon restart usb\root_hub*
pause

Autres commandes intéressantes :
devcon hwids usb*
devcon drivernodes @usb\root_hub*

Acronymes
USB = Universal Serial Bus
PID = Product IDentifier
VID = Vendor ID

Registre
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_0409&PID_005A

 

RemoveDrive et RestartSrDev

La solution DEVCON ci-dessus ne me donne pas entière satisfaction. Par exemple j'ai une clé qui résiste : une fois éjectée elle continue d'apparaître comme un Disque amovible vide qui demande "Insérez un disque dans le lecteur Disque amovible (H:)". Tous mes efforts pour sortir de cette situation ont échoué.

Uwe Sieber contacté au sujet de devcon restart a été très réactif. Il a créé un nouvel utilitaire RestartSrDev à utiliser en conjugaison avec son autre outil RemoveDrive. RestartSrDev est désigné spécialement pour les lecteurs sujets au code d'erreur 21. Le résultat est un succès. Merci Uwe.

Removedrive h:  effectue une éjection propre du lecteur H: qui disparaît cette fois totalement de l'explorateur de fichiers.
Restartsrdev *  redémarre le lecteur avec succès

F:\>removedrive h:

RemoveDrive V1.9 (x64) - prepares drives for safe removal
Freeware by Uwe Sieber - www.uwe-sieber.de
Removing Drive 'H:\' (ChipsBnk Flash Disk USB Device)
success (reactivation is possible)


F:\>restartsrdev *

RestartSrDev V0.1 (x64) - restarts 'Code 21' devices
Freeware by Uwe Sieber - www.uwe-sieber.de
restarting device USB\VID_0204&PID_6025\6&A0B590C&1&3
ok

Sécurité
Si un document est resté ouvert sur la clé, RemoveDrive refuse d'opérer, et on obtient failed au lieu de success.

Téléchargements
http://www.uwe-sieber.de
http://www.uwe-sieber.de/drivetools_e.html
http://www.uwe-sieber.de/files/removedrive.zip
http://www.uwe-sieber.de/files/restartsrdev.zip

Remove-restart-usb-keys.reg
http://fspsa.free.fr/remove-restart-usb-keys.reg
Pratique, ce fichier reg, éditable avec Bloc-Notes, est à fusionner avec le registre.
Il ajoute les items REMOVEDRIVE et RESTARTDRIVE au menu contextuel des volumes.
Usage :
- faire un clic droit sur le lecteur H: et REMOVEDRIVE pour l'éjecter
- faire un clic droit sur un lecteur quelconque et RESTARTDRIVE pour réactiver la clé précédemment éjectée


Surveillance Disque et System Volume Information

Les volumes tels que les clés USB ne sont pas surveillés. Ceci concerne uniquement les disques amovibles.
Les changements de lettre ont l'inconvénient d'activer la surveillance disque (par défaut), un dossier système et caché est alors créé sur la racine, c'est le System Volume Information, ou SVI pour les intimes.
La surveillance disque est désactivable via les Propriétés Système (WIN+Pause), Onglet "Restauration du système. Sélectionner le disque dans la liste et appuyer sur le bouton Paramètres. Ne surtout pas cocher "Désactiver la Restauration du système" car tous les points de restauration seraient perdus.
En changeant de lettre ou en se connectant à un autre ordinateur, l'opération est à refaire.
Ce dispositif activé par défaut. Outre qu'il est peu utile pour un disque de données, il devient une gêne lors de la déconnexion d'un lecteur externe, systématiquement refusée si on ne désactive pas la Surveillance du disque.

RestorWIN

RestorWIN permet, entre autres, de désactiver rapidement la Surveillance d'un ou plusieurs disques. Sans installation, on peut donc copier RestorWIN.exe sur le disque externe. On ne peut que regretter l'absence d'une version en lignes de commandes.

Utilisation
Dans RestorWIN cliquer sur le Bouton "Configurer le système de restauration".
Dans la fenêtre qui s'ouvre aller à la ligne "À désactiver :"
Entrer les lettres des disques à désactiver, séparés par une virgule.
Cliquer sur le Bouton Valider.
Fermer RestorWIN.
Si aucun document ou programme n'est ouvert sur le disque, il est enfin éjectable.

DriveTable.txt

L'information concernant l'activation de la surveillance de chaque disque est stockée dans ce fichier texte :
C:\System Volume Information\_restore{77A7A5BB-21CC-4F85-A1D5-DDF160C6E18C}\drivetable.txt
Le grand nombre est le GUID de la machine. Comme pour les disques, il est noté dans le Registre :

MachineGuid

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore\Cfg
MachineGuid={le GUID de votre machine}
Il est également ici : C:\WINDOWS\system32\restore\MachineGuid.txt

KB302343 : Drivetable.txt contient des informations sur le chemin d'accès des points de montage, les GUID des volumes, les états (figé/désactivé/actif/système) et la taille maximale du magasin de données de chaque lecteur.

Réinitialiser DriveTable.txt résout certains problèmes de Restauration Système (Erreur d'exception, Drive letter missing in System Restore settings)

 

 

Disable_D_SystemRestore.vbs

En VBS la méthode Disable de la classe WMI SystemRestore permet de désactiver facilement la surveillance d'un disque. Voici un exemple pour le disque D  :

'Disable_D_SystemRestore.vbs
Set oSR=GetObject("winmgmts:/root/default:SystemRestore")
oSR.Disable("D:\")

Merci à Gilles LAURENT.

 

DisableThisDiskSystemRestore.vbs

Ce script désactive la surveillance du disque sur lequel il se trouve  :

'DisableThisDiskSystemRestore.vbs
Set oSR=GetObject("winmgmts:/root/default:SystemRestore")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
strPath = objShell.CurrentDirectory
strDrive = objFSO.GetDriveName(strPath)
oSR.Disable(strDrive&"\")

 

 

AssignNewLetterDisableSR.cmd

On peut incorporer cette méthode Disable SystemRestore dans AssignNewLetter.cmd pour désactiver automatiquement la surveillance disque lors du changement de lettre

:version avec script vbs désactivant la surveillance disque
@echo off
color 1F
set volume=%~d0
set letter=%volume:~0,1%
echo.
echo Ce volume a la lettre = %letter% =
set /p NewLetter=Quelle est la nouvelle lettre a attribuer au lecteur ?
set NewLetter=%NewLetter:~0,1%
echo.
echo Vous avez choisi la lettre : %NewLetter%
echo.
if %NewLetter%=="" exit
if /i %NewLetter%==%letter% goto :sameletter
if exist %NewLetter%: goto :exist

set tp=%temp%\tmp.cmd
set tx=%temp%\tmp.txt
set vb=%temp%\tmp.vbs

>%vb% echo Set oSR=GetObject("winmgmts:/root/default:SystemRestore")
>>%vb% echo wscript.sleep 2222
>>%vb% echo oSR.Disable("%NewLetter%:\")

>%tp% echo mountvol %volume% /L^>%tx%
>>%tp% echo mountvol %volume% /D
>>%tp% echo for /f %%%%A in (%tx%) do set lecteur=%%%%A
>>%tp% echo mountvol %NewLetter%: %%lecteur%%
>>%tp% echo start wscript %vb%
>>%tp% echo del %tx%
>>%tp% echo del %tp%

cd /d %temp%
%tp%

if exist %NewLetter%: mountvol %volume% /d
@pause
goto :eof
:sameletter
echo Ce lecteur a deja la lettre %letter%
@pause
goto :eof
:exist
echo %NewLetter%: n'est pas libre
@pause

 

 

 


ChangeVolumeDriveLetter.exe

Gilles LAURENT a récemment mis en place une syndication RSS2 de son site. J'ai ainsi eu le plaisir de découvrir ChangeVolumeDriveLetter.exe qui fait exactement, et de façon plus professionnelle, ce que propose AssignNewLetterDisableSR.cmd
Télécharger ChangeVolumeDriveLetter.zip et en extraire l'exécutable ChangeVolumeDriveLetter.exe
Surtout ne pas l'exécuter de suite afin de ne pas prendre le risque de changer la lettre de votre disque dur.
Copier ChangeVolumeDriveLetter.exe sur un volume amovible.
Exécuter ChangeVolumeDriveLetter.exe depuis le volume amovible. Cette vue montre le programme en cours d'exécution. Ma clé USB nommée QUIR est habituellement montée avec la lettre Q. Elle a ici été déplacée à la lettre B :

Remarque : la lettre A est disponible car je désactive systématiquement mon lecteur A.

 

 

Liens Relatifs

Globalement Windows se débrouille assez bien avec les raccourcis, et il répare souvent de lui-même les raccourcis erronés (info). Mais il est des situations où le comportement du raccourci ne convient pas, et le fichier situé sur le volume amovible n'est pas ouvert (par exemple c'est le fichier d'origine situé sur le disque dur qui est ouvert, ou plus communément le fichier n'est pas trouvé). Est-il possible de s'affranchir de la lettre du lecteur ? Autrement dit, peut-on créer sur un volume amovible un raccourci vers un fichier dudit volume qui fonctionnera quelle que soit la lettre attribuée par le système ? On ne peut pas, à priori, faire de raccourci relatif, l'absence de lettre de lecteur étant refusé. Souvent l'utilisation du raccourci est positive, mais Windows réécrit le raccourci, on le voit en affichant ses Propriétés, pour constater que la lettre a changé en conformité avec la position actuelle du lecteur. Mais ça ne fonctionne pas toujours et la question se pose alors, comment faire pour que les raccourcis fonctionnent quelle que soit la lettre attribuée par le système ? On va voir qu'il est possible de remplacer la lettre par un point.

Nouveau : la nouvelle commande mklink livrée avec Vista permet de créer des liens symboliques relatifs vers des fichiers ou des dossiers, à condition de formater le volume en NTFS. Si on tient compte que la surveillance disque n'est plus automatiquement activée sur Vista, ce procédé, très simple, semble utilisable. Voir plus bas le lien vers l'article sur les Liens NTFS.

 

_Lienrelatif.bat

Le langage Batch accepte les chemins relatifs. Créer un nouveau fichier avec Bloc-Notes, et le sauvegarder sur le lecteur amovible avec ici pour nom : "_LienRelatif.bat" (l'underscore permet que le fichier soit facilement repérable en restant au début de la liste des fichiers dans Explorer). Voici le contenu à copier dans _LienRelatif.bat ==>

CHCP 1252
set fichier=Lettre d'amour.txt
set cheminrelatif=Dossier Relatif\À Françoise Gasan

if not exist "\%cheminrelatif%" (
md "\%cheminrelatif%"
)

if not exist "\%cheminrelatif%\%fichier%" (
echo.>"\%cheminrelatif%\%fichier%"
)

cd /d "\%cheminrelatif%"

start "" .
start "" ".\%fichier%"

pause


Commandes utilisées :

Le Batch est utilisable depuis n'importe où dans le lecteur.

 

Un Batch dans un raccourci

On arrive à faire tenir les commandes nécessaires dans un simple raccourci en utilisant quelques astuces. Créer un Nouveau raccourci sur le lecteur amovible, et supprimer le contenu de la ligne "Démarrer dans". Régler la ligne Exécuter à Réduite. Dans la ligne Cible coller la commande suivante :

cmd /c cd /d "%cd:~0,2%\Dossier Relatif\À Françoise Gasan"&&start "" "Lettre d'amour.txt"

Terminer en modifiant l'icône du raccourci.

 

Plus d'infos dans Aide et Support en collant dans Exécuter les commandes suivantes :

L'aide en ligne SET /? offre quelques exemples de modifications de variables qui ne sont pas montrés dans Aide et Support.

L'avantage de ce raccourci est la possibilité de choisir une icône, et de fonctionner en réduit (sans ouvrir de fenêtre).
L'inconvénient est qu'il est plus difficile à éditer.

 

Créer un raccourci relatif

Pour les plus motivés, il est possible de créer un véritable raccourci qui fonctionnera même si le lecteur change de lettre. Créer le raccourci normalement, puis éditer son contenu avec un éditeur hexadécimal. Identifier le chemin vers la cible et repérer la lettre du lecteur, elle est présente en plusieurs endroits dans le code. La lettre est toujours suivie des deux-points (code 3A). Remplacer le code de la lettre du lecteur par 2E (2E est le code pour le point, qui représente le lecteur courant).

Éditeurs hexadécimaux

L'éditeur hexadécimal utilisé ici est Free Hexa Editor (fhred) car il est plus adapté pour faire les captures d'écrans qui illustrent la suite du propos.
Vous préfèrerez peut-être utiliser
EditHexa qui est en français. Son auteur est Éric Dauteuille (tuto).

Édition du code d'un raccourci

Un raccourci est en fait un fichier, son extension (.LNK) est cachée.
EditHexa édite le raccourci, et ne demande pas si on préfère éditer la cible.
L'éditeur fhred pose lui la question de savoir si on veut ouvrir le fichier que pointe le raccourci ou le raccourci lui-même ==>

 


                                                                                               

 

Traduction du texte de la boite ci-contre :

Vous tentez d'éditer un raccourci.
Cliquez sur Oui si vous voulez éditer le fichier cible du raccourci,
ou cliquez sur Non si vous voulez éditer le raccourci lui-même.
Choisir Annuler pour abandonner.

 

- Cliquer Oui pour éditer la cible du raccourci
- Cliquer Non pour éditer le raccourci lui-même

Petit bug : la boite ci-dessus n'apparait pas si on utilise Open (Menu File) ou l'icone habituelle de la Barre d'outils.

 

 

Exemple de scénario 
On copie sur la clé un dossier du disque C:\ accompagné d'un raccourci pointant sur un document. Voici les propriétés du raccourci sur la clé avant son utilisation  :

En cliquant sur ce raccourci, Windows trouve sur la clé le document qui a été déplacé en même temps que le raccourci. Le document s'ouvre normalement, et on constate que les Propriétés du raccourci ont été mises à jour :

En éditant le raccourci, on identifie facilement la lettre B du volume. Pour ne pas confondre avec d'éventuelles autres lettres B, remarquer qu'une adresse commence par B:\ avec, bien sûr, une petite exception pour la dernière adresse codée d'une façon espacée ==> B : \ 

Codes utiles :

On a donc, côté code, deux groupes 42 3a 5c, et un dernier groupe 42 00 3a 00 5c, ce dernier repéré par les flèches.
Il faut remplacer les trois occurrences du code 42 par le code 2E (point)

La vue suivante montre que le code 2e a remplacé les trois codes 42, le panel de droite montre un point à la place de chaque lettre de volume B ==>

On a également la possibilité de supprimer le nom de la clé, ici FRAMAKEY, en remplaçant son code par des 00.

Sauvegarder et immédiatement protéger le raccourci de toute modification en lui donnant l'attribut R (ReadOnly) avec la commande ATTRIB.
Utiliser la complétion de commande en appuyant sur TAB au lieu de taper le nom du fichier évitera les erreurs.
Remarquer l'extension lnk du raccourci ==>

Le raccourci n'enregistrera ainsi plus la lettre de la clé lors de son utilisation.
Voici ses nouvelles Propriétés :

Si on clique sur OK on a droit à message de Windows. Il faut fermer la fenêtre avec la croix de la Barre de Titre.

Cas du raccourci copié
Si on a l'idée de copier un raccourci existant depuis le disque dur vers la clé, observer que le nom de l'ordinateur et le nom du volume sont notés dans le code du raccourci. Il suffit d'utiliser le raccourci au moins une fois depuis le volume amovible sur lequel il a été déplacé ou copié et le nom de volume sera remplacé par celui de la clé. Si nécessaire on peut s'en affranchir totalement et remplacer le code du nom de volume par des zéros. Ceci corrige les cas où le raccourci est détecté comme erroné, ou bien continue d'ouvrir le document du disque dur au lieu d'ouvrir le document du même nom présent sur la clé. Même chose si le nom de l'ordinateur est présent, remplacer son code par des 00.

 

Téléchargement de l'exemple

http://fspsa.free.fr/lienrelatif.zip
Le zip contient le dossier créé pour notre exemple avec la cible Leads.wri et bien sûr le raccourci relatif Leads.wri.lnk (pas de nom d'ordinateur, pas de label de volume, pas de lettre). Le raccourci doit donc ouvrir le document quel que soit l'endroit d'où on procède, du moment que l'ordonnancement des fichiers n'est pas modifié. Faire des essais depuis le disque dur, le bureau, et bien sûr un volume amovible. Le batch permettant de changer la lettre du volume amovible en B est inclus.

 

Liens Relatifs NTFS

Il est possible, grâce à la mécanique des Points d'Analyse (Reparse Points), de créer des Liens Symboliques Relatifs. C'est très facile avec la nouvelle commande mklink apparue sur Vista et W7, ou, si vous êtes allergique aux lignes de commandes, avec Link Shell Extension. Inconvénient, il faut que le volume amovible soit formaté NTFS. Il est vraiment regrettable que ça ne marche pas avec le format exFAT dédié aux volumes amovibles. Toutes les infos sur l'article consacré aux Liens NTFS, et en particulier, le passage sur les Liens Relatifs.

 

 

Créer des raccourcis sur le Bureau

Si vous êtes amené à vous servir souvent d'ordinateurs différents, vous trouverez peut-être pratique de créer en un clic des raccourcis sur le Bureau de vos outils, fichiers, et dossiers préférés contenus sur votre clé USB. JC Bellamy a créé le script raccourci.vbs facilitant l'opération.

Voici une autre solution proposée par Carine avec l'aide de nircmd, le fameux outil de Nir Sofer. ShortCutUSB.bat installe sur le Bureau les raccourcis des objets listés dans un fichier liste.txt à créer sur la clé USB :

@echo off
set usb=%~d0
for /f "tokens=1 delims=," %%a in (liste.txt) do (
if exist "%userprofile%\Bureau\%%~na.lnk" (
echo le Raccourci pour %%a existe deja…
) else (
nircmd.exe shortcut "%usb%\%%a" "~$folder.desktop$" "%%~na"
echo raccourcis %%~na cree
echo %%~nxa >>delist.txt
)
)
pause

Noter la création de delist.txt qui permet au batch de nettoyage DelShortCutUSB.bat de laisser le Bureau dans l'état où on l'a trouvé :

@echo off
set usb=%~d0
for /f "tokens=1 delims=," %%a in (delist.txt) do (
nircmd.exe execmd del "~$folder.desktop$\%%~na.lnk"
)

 


 

 

Autres articles en relation

 

 

Liens

KB307844 : Comment faire pour modifier des attributions de lettres de lecteur dans Windows XP

On en parle
http://forum.pcastuces.com/raccourcis_dans_cle_usb-f1s171841.htm    :o)
http://forum.pcastuces.com/envoyer_vers_send_to-f3s4629.htm

 


Merci d'avoir lu jusqu'ici !
Retour au début
JF      Les restes du site

compteur Free
Publié le 12/08/2008