Laden...

Laufwerkbuchstaben von USB-Sticks entfernen

Erstellt von Pioneer17 vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.477 Views
P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren
Laufwerkbuchstaben von USB-Sticks entfernen

Hi zusammen

meine Frage ist simpel:
Ich suche eine Möglichkeit den Laufwerksbuchstaben eines USB-Sticks zu entfernen sodass er unter dem Arbeitsplatz nicht mehr ersichtlich ist.

Zielvorhaben:
Ermitteln ob ein spezieller Stick angeschlossen ist, wenn ja dann den Laufwerksbuchstaben entfernen.

Mittels WMI (WIN32_USBControllerDevice) kann ich ermitteln welche USB Geräte angeschlossen sind.
Besteht nach dem entfernen des LW-Buchstabens noch die Möglichkeit auf die Daten des Sticks zuzugreifen?

Mit der Forensuche kommen div. Beiträge in denen es um das ermitteln von LW-Buchstaben geht (oder ändern) jedoch nicht das entfernen.

Danke für die Hilfe

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Pioneer17,

Teilantwort:

Besteht nach dem entfernen des LW-Buchstabens noch die Möglichkeit auf die Daten des Sticks zuzugreifen?

Ja, zumindest wenn es auf dem Stick eine Ordnerfreigabe gibt.

herbivore

5.742 Beiträge seit 2007
vor 12 Jahren

Ja, zumindest wenn es auf dem Stick eine Ordnerfreigabe gibt.

...oder wenn der entsprechende User die Rechte hat, den Buchstaben wieder zuzuordnen 😉

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

NTFS bietet auch die Möglichkeit, Massenspeichergeräte statt über Laufwerksbuchstaben in einen leeren Ordner eines anderen Laufwerks zu mappen (ähnlich "mount" unter Unix/Linux-Umgebungen) ==> für den Zugriff.

Ob das Gerät dafür ebenfalls mit NTFS formatiert sein muss, weiss ich aus dem Stegreif leider nicht.

Ja, zumindest wenn es auf dem Stick eine Ordnerfreigabe gibt.

verstehe ich nicht wirklich. Wenn der Stick nicht mehr im Dateisystem verfügbar ist, wie soll dann eine Freigabe gemappt werden? Gibt es da eine zusätzliche (mir unbekannte) Funktionalität?

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo MarsStein,

wie soll dann eine Freigabe gemappt werden?

über UNC. 100% sicher bin ich nicht, aber ich wüsste nicht, warum es nicht gehen sollte.

herbivore

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Besten Dank für die ersten Antworten.

das mit dem über UNC zugreifen müsste ich noch genauer nachschauen wie das gehen würde, kenne ich nicht.

Jedoch wichtiger ist mir, dass ich den LW-Buchstaben entfernen kann (ggf. auch wieder hinzufügen).

771 Beiträge seit 2009
vor 12 Jahren

Hi,

Das Setzen und Entfernen sollte mit den WinAPI-Funktionen SetVolumeMountPoint und DeleteVolumeMountPoint funktionieren (s. Volume Management Functions )
Von C# aus also mit P/Invoke: pinvoke.net: DeleteVolumeMountPoint (kernel32)

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Danke Cat
das war der nötige Input.

Für diejenigen die das auch mal brauchen:


...
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetVolumeNameForVolumeMountPoint(string
            lpszVolumeMountPoint, [Out] StringBuilder lpszVolumeName,
            uint cchBufferLength);

[DllImport("kernel32.dll")]
static extern bool DeleteVolumeMountPoint(string lpszVolumeMountPoint);

[DllImport("kernel32.dll")]
static extern bool SetVolumeMountPoint(string lpszVolumeMountPoint,
            string lpszVolumeName);
const int MAX_PATH = 260;

private void foo()
{
            //damit erfahre ich die nötige GUID von dem Volume welches ich entfernen möchte
            StringBuilder volume = new StringBuilder(MAX_PATH);
            GetVolumeNameForVolumeMountPoint(@"G:\", volume, (uint)MAX_PATH);

            //setzen des gewünschten LW-Buchstabens mittels der GUID von dem Volume
            SetVolumeMountPoint(@"G:\", volume.ToString());

            //löschen von einem Volume
            DeleteVolumeMountPoint(@"G:\");

}
....

Jetzt muss ich nur noch ein Bsp. finden das mit zeigt wie ich ohne LW-Buchstaben auf die Daten des LW's zugreifen kann. Hat evtl. jemand gleich ein Bsp.?

Anderenfalls kann ich auch das LW mappen, die nötigen Daten kopieren (ins Root Verzeichnis meiner Anwendung) und das LW wieder "löschen"...

795 Beiträge seit 2006
vor 12 Jahren

Probier doch mal

SetVolumeMountPoint(@"C:\MyApp\MyDir\", volume.ToString());

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Ganz einfach!
besten Dank.

Wie ich bereits irgendwo gelesen habe muss dazu jedoch der Ordner immer leer sein, ansonnsten kommt eine Exeption.

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Nun eine weiters kleines Problemchen aufgetreten.

Angenommen der "symbolische Link" wurde entfernt:
Mittels Attributen der Ordner weiss ich ob es in meinem Verzeichnis ein Ordner gibt der "gelinkt" ist.

wie kann ich diesen wieder einbinden?

Mittels WMI weiss ich ob dieser USB Stick angeschlossen ist. Mit GetVolumeNameForVolumeMountPoint kann ich nur Infos erhalten wenn ich einen LW-Buchstaben oder Ordner angebe. Da das LW aber nicht mehr mittels LW-Buchstaben oder Pfad eingebunden ist habe ich diese Infos nicht mehr.

Es müsste ja auch einen Weg geben mit den WMI Infos ein USB Stick einzubinden, so dass ich diesen "symbolische Link" der entfernt wurde wieder kann mittels SetVolumeMountPoint("C:\Test", WMI_Infos) hinzufügen

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Einen kleinen Schritt weiter:
dem dem folgenden Code erhalte ich alle Volumebezeichnungen am PC angeschlossenen Geäte:


            ManagementObjectSearcher disks = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Volume");
            foreach (ManagementObject disk in disks.Get())
            {
                string r = disk.ToString();
            }

und mit folgenden Code alle WMI Infos der USB Geräte:


            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_USBControllerDevice");
            foreach (ManagementObject share in searcher.Get())
            {
                foreach (PropertyData PC in share.Properties)
                {
                    if (PC.Value != null && PC.Value.ToString() != "")
                    {
                        string val = PC.Value.ToString();
                    }
                }
            }

Momentan finde ich keinen Zusammenhang zwischen den beiden Code Blöcken, so dass ich vergleichen könnte welche "disk.ToString()" zu "PC.Value.ToString()" gehört

evtl kann mir jemand das fehlende Puzzle-Teil geben

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Also nach langem Suchen und Probieren habe ich mir folgende Lösung zusammen gestiefelt:

 
//Da sind alle USB-Geräte eingetragen die an einem PC angeschlossen sind / waren
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SYSTEM\\MountedDevices");
string[] arrValNames = regKey.GetValueNames(); // Alle Geräte in einen Array speichern

An dieser Stelle in der Registry sind die USB-Geräte mit der "Nummer" abgelegt wie ich sie mit:


            ManagementObjectSearcher disks = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Volume");
            foreach (ManagementObject disk in disks.Get())
            {
                string r = disk.ToString();
            }

erhalte. Somit habe ich den Link zwischen den beiden Varianten gefunden.

Im jeweiligen Key steht was für ein Gerät das ist, eigenltich das gleiche wie ich mit:


            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_USBControllerDevice");
            foreach (ManagementObject share in searcher.Get())
            {
                foreach (PropertyData PC in share.Properties)
                {
                    if (PC.Value != null && PC.Value.ToString() != "")
                    {
                        string val = PC.Value.ToString();
                    }
                }
            }

bekomme.