7
votes

Déterminez la lettre de lecteur d'un volume de TruCrypt monté

Une fois qu'un conteneur Truecrypt a été monté sur une lettre de lecteur, est-il possible de déterminer dans un fichier de commandes qui conteneur la lettre de lecteur a été montée ou quelle lettre de lecteur le conteneur a été monté sur?

Dans un fichier de commandes, je veux monter un conteneur Truecrypt spécifié sur une lettre de lecteur spécifiée. Erreurs Truecrypt Si le conteneur est déjà monté ou si la lettre de lecteur n'est pas disponible, je veux donc exécuter Truecrypt uniquement si le conteneur spécifié n'a pas déjà été monté sur la lettre de lecteur spécifiée, c'est-à-dire seulement si l'action ne fait que l'action t déjà terminé.

Toutes les suggestions seraient appréciées.

Edit

Résumé de la prime En bref Imagine Vous avez des volumes c: \ vol1.tc et c: \ vol2.tc monté sur des lecteurs X et y . Comment pouvez-vous tel que c: \ vol1.tc est monté sur lecteur x et c: \ vol2.tc pour conduire y programmaticaly avec un fichier de commandes ou un code C #?


0 commentaires

6 Réponses :



0
votes

Je ne suis pas sûr de déterminer le nom de volume en interrogeant la lettre de lecteur ou visa-versa. Une solution de contournement pouvant être acceptable en fonction de vos besoins est d'interroger les serrures de fichier sur le volume. Si le volume est verrouillé, des chances sont bonnes sa montées. Vous pouvez obtenir plus d'une fantaisie si vous le souhaitez et vérifiez qu'il est verrouillé par le processus système spécifiquement, à l'aide de /f.

i. Le lecteur est déjà monté. Pas sûr si c'est juste une erreur affichage vous êtes concerné. Je ne sais pas si vous avez remarqué le Référence de ligne de commande . < P> Voici un simple script CMD pour monter un volume uniquement s'il n'est pas déjà monté, empêchant ainsi les erreurs déclenchées par Truecrypt.exe. Il fait plusieurs hypothèses naïques, mais devrait donner une idée. xxx

Notez qu'en raison de ce qui peut être un bogue dans certaines versions de TruCrypt, la démontage de l'interface graphique provoque la Lettre de lecteur pour être indisponible sur les montages futurs. Une solution de contournement est de démonter la ligne de commande à l'aide de: Truecrypt.exe / Q / DX (où X est la lettre de lecteur).


5 commentaires

Merci pour votre réponse. Je sais déjà si un volume est monté ou non. Je suis juste manquant à savoir sur quelle lettre de lecteur que le volume est monté. Avec la réponse que j'ai postée, je suis capable de le savoir. Ou peut-être que je manque de lire votre réponse plus soigneusement, je le ferai à nouveau;)


J'ai posté une modification sur la question. Merci beaucoup pour l'aide !


En résumé si j'ai deux volumes montés comment puis-je dire avec un fichier de commandes ou un code à quelle lettre de lecteur est monté chaque volume?


@Tono Nam - Vous pouvez éviter ce problème en choisissant quelle lettre de lecteur à monter au lieu d'utiliser / automobile. Ou votre application ne manipule-t-elle pas le montage?


Il gère le montage, mais si quelqu'un monte manuellement un volume dans une lettre d'entraînement différente, je voudrais le savoir. L'utilisateur veut savoir quels volumes sont montés et dans quelle lettre de lecteur. 80% du temps qu'il mette les volumes avec mon programme dans ce cas, c'est bien que je sache dans quelle lettre de lecteur le volume est monté mais lorsque l'utilisateur monte le lecteur manuelle qui est quand j'ai des problèmes. Je ne devrais peut-être pas permettre aux utilisateurs d'ouvrir Truecrypt.exe



0
votes

Je suis peut-être trop simplifié, mais les étiquettes d'entraînement sur les lecteurs montés sont-ils uniques? Si oui, vous pouvez utiliser une recherche simple telle que:

private string GetDriveLetter(string volumeLabel)
{
    string driveLetter = "";

    DriveInfo[] dis = DriveInfo.GetDrives();
    foreach (DriveInfo di in dis)
    {
        var dt = di.DriveType;
        if (dt == DriveType.Fixed || dt == DriveType.Removable)
        {
            if (di.VolumeLabel == volumeLabel)
            {
                driveLetter = di.Name.Substring(0, 1).ToUpper();
                break;
            }
        }
    }

    return driveLetter;
}


0 commentaires

9
votes

Un moyen de faire ce serait de demander directement au pilote TrueCrypt lui-même. Cela pourrait être atteint avec la fonction DeviceIocontrol. En fait, c'est exactement ce que fait l'interface graphique TrueCrypt.

Notez qu'il est plus facile de le faire en C ++. Vous trouverez un bon article ici . < p> L'idée est d'appeler la fonction DeviceIocontrol , demandant le tc_ioctl_get_mounted_volumes Vous obtiendrez une structure, avec tout le chemin de volume monté et des lettres d'entraînement. En fait, il s'agit d'un réseau de 26 éléments (un pour chaque lettre d'entraînement possible), appelé Wszvolume, qui contient le chemin du volume Truecrypt qui est monté sur.

espérons que l'échantillon suivant vous aidera à trouver comment faire comment faire Dans votre cas.

code de code en C #: xxx


0 commentaires

0
votes

Juste pour vous assurer que j'ai raison pour que ce soit: vous voulez vous assurer que Truecrypt monte un certain volume sur une lettre de lecteur à une autre lettre via un script et qu'il ne tentera pas de faire quoi que ce soit si le volume est déjà monté.

Peut-être plusieurs solutions potentielles. Je vais essayer de mettre en évidence quelques options ci-dessous; Faites-moi savoir si cela vaut la peine d'être poursuivie et je continuerai à rechercher et à mettre à jour avec plus de détails.

Option 1: Favoris et montage automatique

TruCrypt prend en charge "Volumes préférés" .

de la page - Les volumes préférés sont utilisés lorsque:

  • Vous avez un volume qui doit toujours être monté sur une lettre de lecteur particulière.
  • Vous avez un volume qui doit être monté automatiquement lorsque son périphérique hôte est connecté à l'ordinateur (par exemple, un conteneur situé sur un lecteur flash USB ou un disque dur USB externe).
  • Vous avez un volume qui doit être monté automatiquement lorsque vous vous connectez au système d'exploitation.
  • Vous avez un volume qui doit toujours être monté comme support en lecture seule ou amovible.

    Certaines choses à noter:

    • Une étiquette spéciale peut être appliquée à chaque volume préféré - pourrait être pratique
    • Vous pouvez exécuter "truecrypt.exe / aisé / quitter" pour monter automatiquement vos volumes préférés puis arrêter de fumer. Vous voudrez peut-être tester cela, car la page Truecrypt Favoris indique que si elle est déjà montée, une fenêtre de l'explorateur est ouverte pour cela.

      Option 2: Vérifiez la lettre de lecteur uniquement

      Si vous montez toujours le volume sur une lettre de lecteur donnée, vous pourrez peut-être faire une hypothèse raisonnable que rien d'autre ne sera assis sur cette lettre de lecteur.

      Si c'est une hypothèse raisonnable, vous pouvez toujours vérifier le lecteur avec PowerShell: xxx

      Je pense que je pense que je pense que je pense que je pense que je pense que de quelque chose de mieux. Laissez-moi savoir si je suis sur la bonne voie.


1 commentaires

Pour clarifier à l'avance: je sais que le script de lots a été demandé, mais je fais une hypothèse (raisonnable, je pense) que PowerShell est probablement disponible à une certaine capacité.



1
votes

Juste pour prolonger la réponse à Veracrypt, modifiée de la publication de Gerard Walace:

Truecrypt and Veranchypt Utilisation dans msft_helpers.cs @ https://github.com/bananaacid/elfcontenait-c-sharp-wpf-compatible-utilité-Classes p>

simple Exemple d'utilisation ici: http://github.com/bananaacid/veracrypt-cmd P >

public static class VcGetMounts
{

    public static async Task<Dictionary<char, string>> getMounted()
    {
        return await Task.Run<Dictionary<char, string>>(() =>
        {
            var ret = new Dictionary<char, string>();

            uint size = (uint)Marshal.SizeOf(typeof(MOUNT_LIST_STRUCT));
            IntPtr buffer = Marshal.AllocHGlobal((int)size);
            uint bytesReturned;
            IntPtr _hdev = CreateFile("\\\\.\\VeraCrypt", FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
            bool bResult = DeviceIoControl(_hdev, TC_IOCTL_GET_MOUNTED_VOLUMES, buffer, size, buffer, size, out bytesReturned, IntPtr.Zero);
            // IMPORTANT! Otherwise, the struct fills up with random bytes from memory, if no VeraCrypt is available
            if (!bResult) return ret;
            MOUNT_LIST_STRUCT mount = new MOUNT_LIST_STRUCT();
            Marshal.PtrToStructure(buffer, mount);
            Marshal.FreeHGlobal(buffer);

            for (int i = 0; i < 26; i++)
                if (mount.wszVolume[i].ToString().Length > 0)
                    ret.Add((char)('A' + i), mount.wszVolume[i].ToString());

            return ret;
        });
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    class MOUNT_LIST_STRUCT
    {
        public readonly UInt32 ulMountedDrives; /* Bitfield of all mounted drive letters */
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
        public readonly MOUNT_LIST_STRUCT_VOLUME_NAME[] wszVolume;  /* Volume names of mounted volumes */
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
        public readonly MOUNT_LIST_STRUCT_VOLUME_LABEL[] wszLabel;  /* Volume labels of mounted volumes */
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
        public readonly MOUNT_LIST_STRUCT_VOLUME_ID[] volumeID;  /* Volume labels of mounted volumes */
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
        public readonly UInt64[] diskLength;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
        public readonly int[] ea;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
        public readonly int[] volumeType;   /* Volume type (e.g. PROP_VOL_TYPE_OUTER, PROP_VOL_TYPE_OUTER_VOL_WRITE_PREVENTED, etc.) */
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)]
        public readonly bool[] truecryptMode;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    struct MOUNT_LIST_STRUCT_VOLUME_NAME
    {
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I2, SizeConst = 260)]
        public readonly char[] wszVolume;   /* Volume names of mounted volumes */

        public override string ToString()
        {
            return (new String(wszVolume)).TrimEnd('\0');
        }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    struct MOUNT_LIST_STRUCT_VOLUME_ID
    {
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I2, SizeConst = 32)]
        public readonly char[] volumeID;   /* Volume ids of mounted volumes */

        public override string ToString()
        {
            return (new String(volumeID)).TrimEnd('\0');
        }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    struct MOUNT_LIST_STRUCT_VOLUME_LABEL
    {
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I2, SizeConst = 33)]
        public readonly char[] wszLabel;   /* Volume labels of mounted volumes */

        public override string ToString()
        {
            return (new String(wszLabel)).TrimEnd('\0');
        }
    }

    public static int CTL_CODE(int DeviceType, int Function, int Method, int Access)
    {
        return (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2)
          | (Method));
    }
    private static readonly uint TC_IOCTL_GET_MOUNTED_VOLUMES = (uint)CTL_CODE(0x00000022, 0x800 + (6), 0, 0);

    [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
    static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
    IntPtr lpInBuffer, uint nInBufferSize,
    IntPtr lpOutBuffer, uint nOutBufferSize,
    out uint lpBytesReturned, IntPtr lpOverlapped);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr CreateFile(
         [MarshalAs(UnmanagedType.LPTStr)] string filename,
         [MarshalAs(UnmanagedType.U4)] FileAccess access,
         [MarshalAs(UnmanagedType.U4)] FileShare share,
         IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
         [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
         [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
         IntPtr templateFile);
}


12 commentaires

Très intéressant, merci! Marshalling est si dur et moche Thoug, je ne vais jamais y entrer


@Liquidcore: J'ai une catégorie plus lié à Git Repo, avec des trucs supplémentaires que j'ai utilisés dans un projet (pourrait vous aider à sortir): github.com/bananaacid/...


@Liquidcore spécifiquement utils msft_helpers.cs


Merci mec!!! Puis-je vous demander la permission de réutiliser une partie de ce code pour une utilisation personnelle que?


@Liquidcore: est tombé gratuit, sa totalité de licence de MIT. Et: j'aimerais voir, ce que tu as fait avec ça. BTW: le projet que j'ai réalisé avec elle: epm.bananaacid.de


Super travail. La majeure partie du code ira probablement dans une bibliothèque de base .NET que je fais que cela fait beaucoup de prises communes et moins communes que je dois faire dans le codage quotidien (gestion du système de fichiers / création de fichiers, / lecture, gestion de lecteurs, réseau chèques, conversions et ainsi de suite). De cette façon, je peux simplement mettre ma DLL dans mes projets et éviter d'écrire un code ennuyeux à chaque fois.


J'ai essayé le code Veracrypt dans un simple formulaire Windows avec un lecteur Veracrypt monté, mais le Winform reste juste insensible, même après 2 minutes. Je pense que quelque chose ne fonctionne pas là-bas. Est-ce que je manque quelque chose?


Appelez-le: Dictionnaire Infosvc = attendre vcgetmount.getmountré (); insensible? Habituellement parce que vous attendez une longue tâche ... Avez-vous monté sur un chemin, au lieu d'une lettre de lecteur? Je n'ai pas testé cela. BTW - Vous pourriez me contacter sur Skype - en utilisant le même surnom


Je l'ai fait avec Var Infosvc = attendre .... etc donc c # gérerait le type. J'ai attendu comme 2 minutes. Il semble que beaucoup d'être une tâche de démontage de disque. Normalement, il faut 10 secondes


Cela devrait être instantané.


Eh bien, ça ne marche pas pour une raison quelconque. Je vais vérifier la chose de Drive avec mon propre code


Avez-vous monté une partition? Avez-vous installé un Veracrypt récent? La classe même utilisée dans mon code est à Github. Je regarderais le code de la tienne si vous le souhaitez.