Laden...

Wie kann man den Laufwerksnamen erkennen?

Erstellt von homer Jay vor 18 Jahren Letzter Beitrag vor 14 Jahren 17.396 Views
H
homer Jay Themenstarter:in
27 Beiträge seit 2005
vor 18 Jahren
Wie kann man den Laufwerksnamen erkennen?

hi leuz

Ich weiß wie man die Laufwerksbezeichnung heruausfinden kann bzw. auflisten lassen kann:

Environment.GetLocalDrives();

diese methode gibt eine stringarray mit den laufwerksbezeichnungen zurück!

Ich bräuchte jedoch den Namen der Laufwerke die man selber vergeben kann.
(Partition rechtsklick >> Umbenennen)

z.B:
mein Laufwerk D: würde "Daten" heißen, möchte ich "Daten" und nicht "D:" erhalten!!

Wie kann man dies realisieren???

thx im voraus homer Jay

Schlimmer als der Tod sind die Frauen ^^!!!!!

S
125 Beiträge seit 2005
vor 18 Jahren

Hallo homer jay.

Über WMI geht das und vieles mehr ziemlich simpel. Ist ähnlich wie SQL-Abfragen.

Hier mal ein Beispiel:

 
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Management;
using System.Globalization;

namespace LogicalDiskInfo
{
	/// <summary>
	/// Summary description for LogicalDisk.
	/// </summary>
	public class LogicalDisk
	{
		private string _Name;
		private bool _VolumeDirty;

		public LogicalDisk()
		{
			GetLogicalDiskInfo();
		}

		private void GetLogicalDiskInfo()
		{
			try
			{	
				ManagementObjectSearcher query;						// Abfrage
				ManagementObjectCollection queryCollection;			// Sammlung von Objekten
				System.Management.ObjectQuery oq;					// Objekt-Abfrage
				string MachineName = "localhost";				// default = localhost
				ConnectionOptions co = new ConnectionOptions();		// Wichtig für Remote-System
				System.Management.ManagementScope ms;				// "Fokus" auf das System
				// (Woher sollen die Infos kommen)

			
				ms = new System.Management.ManagementScope("\\\\" + MachineName + "\\root\\cimv2", co);
				oq = new System.Management.ObjectQuery("SELECT * FROM Win32_LogicalDisk WHERE Caption = 'C:'"); 
				query = new ManagementObjectSearcher(ms,oq);
				queryCollection = query.Get();

				#region Durchlaufabfrage der Volume-Daten
				foreach(ManagementObject mo in queryCollection)
				{
					_Name = mo["Name"] == null ? "" : mo["Name"].ToString();
				}
				#endregion

				ManagementObject[] mobj = new ManagementObject[queryCollection.Count];
				queryCollection.CopyTo(mobj,0);
				foreach(ManagementObject mo in mobj)
					Console.WriteLine(mo.GetText(TextFormat.Mof));

				LogicalDiskInfoConsoleOutput();
			}
			catch(Exception e)
			{
				Console.WriteLine("ERROR-->LogicalDisk\n\n" + e.ToString());
			}	
		}

		private void LogicalDiskInfoConsoleOutput()
		{
			Console.WriteLine("VolumeDirty: " + _VolumeDirty);
		}
	}
}

Hier ist nur gegeben wie du WMI anwendest. Genaueres erfährst du über MSDN

Dort stehen die benötigten Fakten. Falls etwas unklar ist, meld dich.

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

N
4.644 Beiträge seit 2004
vor 18 Jahren
ManagementObjectSearcher m_managementObject = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    foreach( ManagementObject obj in m_managementObject.Get() )
        MessageBox.Show((string)obj["VolumeName"]);

System.Management.dll referenzieren.

H
homer Jay Themenstarter:in
27 Beiträge seit 2005
vor 18 Jahren

thx für die raschen antworten!!^^

Welche Version der .NET Framework brauche ich für den geposteten code?
Denn bei mir sagt er:

Managment ist nich im namespace System vorhanden.

(sinngemäß nicht exakt)

homer Jay

Schlimmer als der Tod sind die Frauen ^^!!!!!

S
125 Beiträge seit 2005
vor 18 Jahren

Du wirst schon die entsprechende DLL referenzieren müssen.

Visual Studio --> Projektmappen-Explorer (Rechtsklick auf Referenzen) --> Referenz Hinzufügen --> System.Management suchen --> auswählen...

---> freuen 😁

Jetzt sollte es funtzen...

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

H
homer Jay Themenstarter:in
27 Beiträge seit 2005
vor 18 Jahren

thx für die raschen antworten
funzt soweit auch gut.

ich hab jetzt nochmal über meine porblemstellung nachgedacht:

und bin zum schluss gekommen, dass es nicht reicht nur die laufwerke und deren namen auzulesen.

Ich muss erkennen wenn ein neuer datenträger (USB stick, mp3 Player) an den pc angeschlossen wird und möglichst viele eigenschaften des selbigen (z.B. volumen....) vielleicht sogar die marke.

Meine idee war zunächst auszulesen welche laufwerke vorhanden sind und immer zu überprüfen ob ein weiterer datenträger \ laufwerk hinzugekommen ist, dies reicht mir aber nicht ganz aus.

Schlimmer als der Tod sind die Frauen ^^!!!!!

S
125 Beiträge seit 2005
vor 18 Jahren

Hallo homer Jay.

Falls du dich mit dem Beispiel für WMI auseinandergesetzt hast, dann wirst du evtl. auch die passende Lösung für dein Problem finden. Schau dich mal auf den MSDN Seiten bei WMI um.

z.B. hier:

Win32_USBControllerClass

oder hier:

Win32USBHub

Die Suche dort kann etwas dauern, aber ich bin bis jetzt fast immer fündig geworden.

Hoffe dir geholfen zu haben.

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

H
homer Jay Themenstarter:in
27 Beiträge seit 2005
vor 18 Jahren

hab bei den links von SGT_BOB gesucht und etwas gefunden, ich hab es jetzt geschafft, dass ich abfragen kann ob ein bestimmter mp3 player oder usbdatenträger angeschlossen ist:

ManagementObjectSearcher mang = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity");
			
			foreach( ManagementObject obj in mang.Get() )
			{
				if(Convert.ToString(obj["Name"]) == "USB-HS HTC426020G7CE00 USB Device") //name meines mp3 Players
				{
					//mp3 player is an den computer angeschlossen
				}
			}

die url dafür

Ich werde nun in einem timer ständig abfragen ob der player angeschlossen ist.

Soviel zum erkennen ob der mp3 player angeschlossen wurde, aber wie kann ich her aus finden welchen laufwerks buchstabe er im arbeitsplatz hat?
In Win32_PnPEntity gibt es dafür nichts!

Hat jemand einen tipp für mich??

homer Jay

Schlimmer als der Tod sind die Frauen ^^!!!!!

T
7 Beiträge seit 2005
vor 18 Jahren

hey hab ein ähnliches problem,

ich hab ne listbox mit allen laufwerken,

will dort nun standardmäßig alle USb sticks auf checked = true setzen

ich kann aber nur über

DriveType
Data type: uint32
Access type: Read-only

Numeric value that corresponds to the type of disk drive this logical disk represents.  
Value 	Meaning  
0 	Unknown  
1 	No Root Directory  
2 	Removable Disk  
3 	Local Disk  
4 	Network Drive  
5 	Compact Disc  
6 	RAM Disk  

die laufwerkstypen finden, dadurch gibts bei mir keinen unterschied zwischen diskettenlaufwerk und usblaufwerk(was wohl usb stikcs, digicams usw einschliessen würde)

weiss jemand wie ich das realisieren kann?

danke

211 Beiträge seit 2005
vor 18 Jahren

@tha_jb

Kannst du das Beispiel posten, da ich genau das programmieren muß

danke

lg

lg Burnswigg

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

Mit DriveInfo.VolumeLabel kann man die Bezeichnung des Laufwerks auch ohne WMI abfragen.

Nobody is perfect. I'm sad, i'm not nobody 🙁

L
553 Beiträge seit 2007
vor 16 Jahren

Ich habe auch eine Frage: Wenn ich jetzt so eine Abfrage sende: "SELECT * FROM Win32_LogicalDisk WHERE DriveType = '3'" wie kann ich in einem int speichern wie viele Datensätze gefunden wurden?

J
3.331 Beiträge seit 2006
vor 16 Jahren

Frohes Neues Jahr!

Ich habe zwar von diesen Abfragen keine Ahnung, würde es aber auf jeden Fall einmal mit SELECT COUNT(*) probieren. Jürgen

L
553 Beiträge seit 2007
vor 16 Jahren

Nur irgendwas stimmt mit den WMI Daten nicht, laut den WMI Daten ist mein C driver 83 GB Groß aber die wirkliche Größe ist 78GB

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

@lord_fritte: Vielleicht geht WMI ja auch nach den Herstellerangaben (1kb = 1000 Byte) 😁

@homer Jay:
Ich wollte mal am Rande mitteilen, dass WMI auch Events kennt, d.h. man kann sich bei bestimmten Ereignissen benachrichtigen lassen (z.B. starten von Programmen, Datenträger-Wechsel, ...).

Wenn es nur um USB-Laufwerke geht, gibt's hier im Forum auch ein fertiges Beispiel, wie man auch Status-Änderungen von USB-Medien (inkl. Auswerfen, ...) reagieren kann. Einfach mal suchen ... 🙂

Edit: Hab' auf CodeProject was gefunden: CodeProject: USBeject.

Da geht es zwar primär um das Auswerfen von USB-Datenträgern, allerdings erkennt das Programm auch automatisch neu angeschlossene Geräte und zeigt interessante Informationen dazu an 😉

Edit: Schlagwörter: USB Laufwerk wechsel eject auswerfen

Nobody is perfect. I'm sad, i'm not nobody 🙁

L
553 Beiträge seit 2007
vor 16 Jahren

@tom-essen
Kann man das irgendwie umrechnen?

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

@lord_fritte:
Ich hatte das eher als Vermutung geäußert, aber umrechnen kann man dass natürlich.
Einfach die WMI-Größenangabe durch 0,93 (10003 / 10243).

Nobody is perfect. I'm sad, i'm not nobody 🙁

L
553 Beiträge seit 2007
vor 16 Jahren

Geht aber, danke

Aber ich habe ein neues Ploblem, ich möchte die Abfrage so anpassen, dass er alles ausließt wo ein Name vorhanden ist:
SELECT * FROM Win32_LogicalDisk WHERE Name != ''

Das ergibt aber nichts:
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinst
anz festgelegt.
bei DriverTest.Program.GetDriverInfo(Int32& driverCount, String[]& driverID,
String[]& driverName, UInt64[]& driverSize, UInt64[]& driverFree) in D:\Dokument
e\Visual Studio 2005\Projects\C#\DriverTest\DriverTest\Program.cs:Zeile 54.
Drücken Sie eine beliebige Taste . . .

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

@lord_fritte:
Ein wenig Code deines Programms könnte durchaus weiterhelfen 😉

Nobody is perfect. I'm sad, i'm not nobody 🙁

L
553 Beiträge seit 2007
vor 16 Jahren

Ja Hier:


static void Main(string[] args)
        {
            try
            {
                // Laufwerke und Laufwerkstypen abfragen
                ManagementScope scope = new ManagementScope(ManagementPath.DefaultPath);
                SelectQuery wql = new SelectQuery("SELECT * FROM Win32_LogicalDisk WHERE Name != ''");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, wql);

                // Nodes eintragen
                foreach (ManagementObject item in searcher.Get())
                {
                    
                    Console.WriteLine(item["DeviceID"].ToString());
                    Console.WriteLine(item["VolumeName"].ToString());
                    Console.WriteLine(System.Convert.ToUInt64(item["Size"]));
                    Console.WriteLine(System.Convert.ToUInt64(item["FreeSpace"]));
                    
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

S
8.746 Beiträge seit 2005
vor 16 Jahren

Geht nur Prüfung auf Gleichheit. Du musst das anschließend in der foreach-Schleife machen. Das sieht nur aus wie SQL, isses aber nicht.

M
6 Beiträge seit 2008
vor 14 Jahren

hi,
das past gerade zu meinen Problem. Gibt es eine Möglichkeit Netzlaufwerke direkt umzubenennen? Sprich den VolumeLabel wie bei Driveinfo.... jemand eine Idee?

L
1 Beiträge seit 2009
vor 14 Jahren

@masterZed: Hi, das ist zwar OffTopic, jedoch denke ich nicht, das dies funktioniert. Die Beschreibung einer Freigabe wird auf dem Server mit der jeweiligen Freigabe definiert und nicht lokal an jedem Client.