Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie kann man den Laufwerksnamen erkennen?
homer Jay
myCSharp.de - Member



Dabei seit:
Beiträge: 27
Herkunft: von zu Hause

Themenstarter:

Wie kann man den Laufwerksnamen erkennen?

beantworten | zitieren | melden

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 ^^!!!!!
private Nachricht | Beiträge des Benutzers
SGT_BOB
myCSharp.de - Member



Dabei seit:
Beiträge: 125
Herkunft: Aachen

beantworten | zitieren | melden

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>_
*************************
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
homer Jay
myCSharp.de - Member



Dabei seit:
Beiträge: 27
Herkunft: von zu Hause

Themenstarter:

beantworten | zitieren | melden

thx für die raschen antworten!!^^

Welche Version der .NET Framework brauche ich für den geposteten code?
Denn bei mir sagt er:
Zitat
Managment ist nich im namespace System vorhanden.

(sinngemäß nicht exakt)

homer Jay
Schlimmer als der Tod sind die Frauen ^^!!!!!
private Nachricht | Beiträge des Benutzers
SGT_BOB
myCSharp.de - Member



Dabei seit:
Beiträge: 125
Herkunft: Aachen

beantworten | zitieren | melden

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>_
*************************
private Nachricht | Beiträge des Benutzers
homer Jay
myCSharp.de - Member



Dabei seit:
Beiträge: 27
Herkunft: von zu Hause

Themenstarter:

beantworten | zitieren | melden

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 ^^!!!!!
private Nachricht | Beiträge des Benutzers
SGT_BOB
myCSharp.de - Member



Dabei seit:
Beiträge: 125
Herkunft: Aachen

beantworten | zitieren | melden

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>_
*************************
private Nachricht | Beiträge des Benutzers
homer Jay
myCSharp.de - Member



Dabei seit:
Beiträge: 27
Herkunft: von zu Hause

Themenstarter:

beantworten | zitieren | melden

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 ^^!!!!!
private Nachricht | Beiträge des Benutzers
tha_jb
myCSharp.de - Member



Dabei seit:
Beiträge: 8

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Burnswigg
myCSharp.de - Member

Avatar #avatar-1859.jpg


Dabei seit:
Beiträge: 211

beantworten | zitieren | melden

@tha_jb

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

danke

lg
lg Burnswigg
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1928
Herkunft: NRW

beantworten | zitieren | melden

Hallo!

Mit DriveInfo.VolumeLabel kann man die Bezeichnung des Laufwerks auch ohne WMI abfragen.
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers
lord_fritte
myCSharp.de - Member



Dabei seit:
Beiträge: 558

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3358
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
lord_fritte
myCSharp.de - Member



Dabei seit:
Beiträge: 558

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1928
Herkunft: NRW

beantworten | zitieren | melden

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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von tom-essen am .
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers
lord_fritte
myCSharp.de - Member



Dabei seit:
Beiträge: 558

beantworten | zitieren | melden

@tom-essen
Kann man das irgendwie umrechnen?
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1928
Herkunft: NRW

beantworten | zitieren | melden

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 (1000^3 / 1024^3).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tom-essen am .
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers
lord_fritte
myCSharp.de - Member



Dabei seit:
Beiträge: 558

beantworten | zitieren | melden

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 . . .
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1928
Herkunft: NRW

beantworten | zitieren | melden

Hallo!

@lord_fritte:
Ein wenig Code deines Programms könnte durchaus weiterhelfen
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers
lord_fritte
myCSharp.de - Member



Dabei seit:
Beiträge: 558

beantworten | zitieren | melden

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());
            }
        }
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8775
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
masterZed
myCSharp.de - Member



Dabei seit:
Beiträge: 6

beantworten | zitieren | melden

hi,
das past gerade zu meinen Problem. Gibt es eine Möglichkeit Netzlaufwerke direkt umzubenennen? Sprich den VolumeLabel wie bei Driveinfo.... jemand eine Idee?
private Nachricht | Beiträge des Benutzers
luftdieb
myCSharp.de - Member



Dabei seit:
Beiträge: 1

beantworten | zitieren | melden

@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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von luftdieb am .
private Nachricht | Beiträge des Benutzers