IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Commandes de retrait de périphérique en toute sécurité.


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut Commandes de retrait de périphérique en toute sécurité.
    Bonjour,
    Je voulais savoir quelles étaient les opérations que windows(XP et 7) effectuaient afin de pouvoir retirer un périphérique de stokage usb en toute sécurité.
    En effet, il n'y a pas de commande directe permettant de faire ce retrait, et la commande diskpart seule ou mountvol .
    Je ne souhaite pas utiliser d'API complémentaire qui ne sont pas applicables dans le cadre de ce que je fais actuellement.
    J'ai trouvé à cet endroit une partie de code en C permetant de retirer le periphérique en toute sécurité, cependant ce code n'est pas directement corélé
    avec les commandes windows qui sont utilisées pour arriver au résultat désiré.(je prends aussi si quelqu'un peut me donner des pistes pour relier ce codes à des commandes windows)
    http://support.microsoft.com/?scid=k...5721&x=18&y=13

    Etant débutant dans le milieu de la programmation, je n'ai pas encore certains reflexes me permettant d'arriver rapidement aux informations que je cherche.
    (mais j'essaye de me débrouiller pour les acquérir le plus vite possible).

    Merci de vos réponses
    (PS: j'espère ne pas m'être trompé de section de forum )

  2. #2
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Salut,

    Regarde du côté de la commande ou utilitaire "devcon.exe",
    ça fonctionne très bien pour ce que tu veux faire.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut
    Merci pour cette reponse;
    j'avais un peu regardé du coté de devcon , cependant j'aimerais tenter de le
    faire sans ajouter de module complémentaire.
    Je compte tenter d'utiliser Diskpart qui est inclus de base , mais je suis pas sur
    que ça marchera sans une petite siouxerie car de base sur Xp diskpart ne me
    liste pas les disques amovibles usb(en revanche ,c'est listé comme un volume
    amovible, et du coup la commande remove ne fonctionne pas).

  4. #4
    Membre éprouvé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Par défaut
    Bonjour,
    Est-ce que le fait d'inclure dans ton batch le fichier devcon.exe te conviendrai ? ce qui fera que ton batch sera autonome et n'aura pas besoin de fichier supplémentaire mais utilisera quand même la commande devcon.exe.

  5. #5
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Citation Envoyé par Nobody060686 Voir le message
    (en revanche ,c'est listé comme un volume
    amovible, et du coup la commande remove ne fonctionne pas).
    Pour que la commande fonctionne, il faut que le volume ait le focus. Assure-toi que tu procèdes de la bonne manière avec les bonnes étapes. Par contre, mieux vaut pas se tromper de volume.

    Les autres pistes serait, là, comme ça, à froid, l'usage de wmi ou encore rundll32 avec la possibilité d'envoyer un paramètre à la dll hotplug (je sais plus ci c'est le bon non, ou si c'est faisable). À creuser donc...

    @Cmanix,

    L’empaquetage d'outils est intéressant, mais connait ses limites du fait que si l'exécutable extrait n'est pas préalablement connu du système correctement sécurisé, son exécution sera bloquée. Ainsi, un utilitaire comme devcon, qui peut se montrer fort utile, mérite sa place dans le système.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 7
    Par défaut
    merci de vos réponse et suggestions.
    J'avais déja mis le focus sur le bon volume, mais à priori cela ne suffit pas pour la commande remove, cependant je ne peux pas selectionnner le disque amovible D, dans la mesure où il n'apparait pas dans la liste des disques(il me met un message d'erreur).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Diskpart>list disk
        Volume ###   Ltr   Label    Fs       Type         Size        Status   Info
        ----------     ---  ------   -----    --------     -------  -------  -------
        Volume 0       C     MAIN    NTFS   Partition     150 GB    Healthy   System
    
    Diskpart>Select volume 1
    the selected volume is volume 1
    Diskpart>list volume
        Volume ###   Ltr   Label    Fs       Type         Size        Status   Info
        ----------     ---  ------   -----    --------     -------  -------  -------
        Volume 0       C     MAIN     NTFS   Partition     150 GB    Healthy   System
    *  Volume 1       D     MACLEF FAT32  Removable  3820 MB
    
    Diskpart>remove letter=d mount=all
    The arguments you specified for this command are not valid
    Diskpart>remove letter=d mount=all dismount
    The arguments you specified for this command are not valid
    Diskpart>remove dismount
    The arguments you specified for this command are not valid
    Diskpart>remove letter=d dismount
    The arguments you specified for this command are not valid
    Diskpart>remove {letter=d mount=all}
    The arguments you specified for this command are not valid
    Diskpart>Select volume=D
    The selected volume is volume 1
    remove letter=D
    The specified letter is not assigned to this volume

    Donc bref, je continue a chercher, quand j'aurais une solution, je ne manquerais pas de la poster.
    sinon sur le site de microsoft on peut trouver des sources en C qui permettent d'ejecter un periphérique en toute sécurité, reste a voir si il est adaptable en lignes de commandes(car j'ai un peu de mal a voir la correspondance C/lignes de commandes . pour ceux qui seraient interressés, voila les sources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
     #include <windows.h>
       #include <winioctl.h>
       #include <tchar.h>
       #include <stdio.h>
    
       // Prototypes
    
       BOOL EjectVolume(TCHAR cDriveLetter);
    
       HANDLE OpenVolume(TCHAR cDriveLetter);
       BOOL LockVolume(HANDLE hVolume);
       BOOL DismountVolume(HANDLE hVolume);
       BOOL PreventRemovalOfVolume(HANDLE hVolume, BOOL fPrevent);
       BOOL AutoEjectVolume(HANDLE hVolume);
       BOOL CloseVolume(HANDLE hVolume);
    
       LPTSTR szVolumeFormat = TEXT("\\\\.\\%c:");
       LPTSTR szRootFormat = TEXT("%c:\\");
       LPTSTR szErrorFormat = TEXT("Error %d: %s\n");
    
       void ReportError(LPTSTR szMsg)
       {
           _tprintf(szErrorFormat, GetLastError(), szMsg);
       }
    
       HANDLE OpenVolume(TCHAR cDriveLetter)
       {
           HANDLE hVolume;
           UINT uDriveType;
           TCHAR szVolumeName[8];
           TCHAR szRootName[5];
           DWORD dwAccessFlags;
    
           wsprintf(szRootName, szRootFormat, cDriveLetter);
    
           uDriveType = GetDriveType(szRootName);
           switch(uDriveType) {
           case DRIVE_REMOVABLE:
               dwAccessFlags = GENERIC_READ | GENERIC_WRITE;
               break;
           case DRIVE_CDROM:
               dwAccessFlags = GENERIC_READ;
               break;
           default:
               _tprintf(TEXT("Cannot eject.  Drive type is incorrect.\n"));
               return INVALID_HANDLE_VALUE;
           }
    
           wsprintf(szVolumeName, szVolumeFormat, cDriveLetter);
    
           hVolume = CreateFile(   szVolumeName,
                                   dwAccessFlags,
                                   FILE_SHARE_READ | FILE_SHARE_WRITE,
                                   NULL,
                                   OPEN_EXISTING,
                                   0,
                                   NULL );
           if (hVolume == INVALID_HANDLE_VALUE)
               ReportError(TEXT("CreateFile"));
    
           return hVolume;
       }
    
       BOOL CloseVolume(HANDLE hVolume)
       {
           return CloseHandle(hVolume);
       }
    
       #define LOCK_TIMEOUT        10000       // 10 Seconds
       #define LOCK_RETRIES        20
    
       BOOL LockVolume(HANDLE hVolume)
       {
           DWORD dwBytesReturned;
           DWORD dwSleepAmount;
           int nTryCount;
    
           dwSleepAmount = LOCK_TIMEOUT / LOCK_RETRIES;
    
           // Do this in a loop until a timeout period has expired
           for (nTryCount = 0; nTryCount < LOCK_RETRIES; nTryCount++) {
               if (DeviceIoControl(hVolume,
                                   FSCTL_LOCK_VOLUME,
                                   NULL, 0,
                                   NULL, 0,
                                   &dwBytesReturned,
                                   NULL))
                   return TRUE;
    
               Sleep(dwSleepAmount);
           }
    
           return FALSE;
       }
    
       BOOL DismountVolume(HANDLE hVolume)
       {
           DWORD dwBytesReturned;
    
           return DeviceIoControl( hVolume,
                                   FSCTL_DISMOUNT_VOLUME,
                                   NULL, 0,
                                   NULL, 0,
                                   &dwBytesReturned,
                                   NULL);
       }
    
       BOOL PreventRemovalOfVolume(HANDLE hVolume, BOOL fPreventRemoval)
       {
           DWORD dwBytesReturned;
           PREVENT_MEDIA_REMOVAL PMRBuffer;
    
           PMRBuffer.PreventMediaRemoval = fPreventRemoval;
    
           return DeviceIoControl( hVolume,
                                   IOCTL_STORAGE_MEDIA_REMOVAL,
                                   &PMRBuffer, sizeof(PREVENT_MEDIA_REMOVAL),
                                   NULL, 0,
                                   &dwBytesReturned,
                                   NULL);
       }
    
       AutoEjectVolume(HANDLE hVolume)
       {
           DWORD dwBytesReturned;
    
           return DeviceIoControl( hVolume,
                                   IOCTL_STORAGE_EJECT_MEDIA,
                                   NULL, 0,
                                   NULL, 0,
                                   &dwBytesReturned,
                                   NULL);
       }
    
       BOOL EjectVolume(TCHAR cDriveLetter)
       {
           HANDLE hVolume;
    
           BOOL fRemoveSafely = FALSE;
           BOOL fAutoEject = FALSE;
    
           // Open the volume.
           hVolume = OpenVolume(cDriveLetter);
           if (hVolume == INVALID_HANDLE_VALUE)
               return FALSE;
    
           // Lock and dismount the volume.
           if (LockVolume(hVolume) && DismountVolume(hVolume)) {
               fRemoveSafely = TRUE;
    
               // Set prevent removal to false and eject the volume.
               if (PreventRemovalOfVolume(hVolume, FALSE) &&
                   AutoEjectVolume(hVolume))
                   fAutoEject = TRUE;
           }
    
           // Close the volume so other processes can use the drive.
           if (!CloseVolume(hVolume))
               return FALSE;
    
           if (fAutoEject)
               printf("Media in Drive %c has been ejected safely.\n",
                      cDriveLetter);
           else {
               if (fRemoveSafely)
                   printf("Media in Drive %c can be safely removed.\n",
                   cDriveLetter);
           }
    
           return TRUE;
       }
    
       void Usage()
       {
           printf("Usage: Eject <drive letter>\n\n");
           return ;
       }
    
       void main(int argc, char * argv[])
       {
           if (argc != 2) {
               Usage();
               return ;
           }
    
           if (!EjectVolume(argv[1][0]))
               printf("Failure ejecting drive %c.\n", argv[1][0]);
    
           return ;
       }
    lien de la page :
    http://support.microsoft.com/?scid=k...5721&x=18&y=13

  7. #7
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    essaye avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select volume=D
    remove letter=D
    Pour ton code, c'est un exemple de code source en C à compiler pour faire programme en .exe, il ne peut donc pas être interprété et exécuté comme un script et il ne correspond donc pas à ton besoin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/09/2009, 20h32
  2. Internet : Identifié en toute sécurité sans SSL
    Par Sergejack dans le forum Sécurité
    Réponses: 3
    Dernier message: 05/03/2009, 13h05
  3. Retirer le périphérique en toute sécurité
    Par ceugniet dans le forum Windows XP
    Réponses: 5
    Dernier message: 18/11/2008, 20h00
  4. Réponses: 1
    Dernier message: 28/02/2006, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo