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 ^^!!!!!
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>_
*************************
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.
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 ^^!!!!!
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>_
*************************
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 ^^!!!!!
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:
oder hier:
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>_
*************************
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
}
}
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 ^^!!!!!
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
@tha_jb
Kannst du das Beispiel posten, da ich genau das programmieren muß
danke
lg
lg Burnswigg
Hallo!
Mit DriveInfo.VolumeLabel kann man die Bezeichnung des Laufwerks auch ohne WMI abfragen.
Nobody is perfect. I'm sad, i'm not nobody 🙁
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?
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
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
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 🙁
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 🙁
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 . . .
Hallo!
@lord_fritte:
Ein wenig Code deines Programms könnte durchaus weiterhelfen 😉
Nobody is perfect. I'm sad, i'm not nobody 🙁
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());
}
}
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.
hi,
das past gerade zu meinen Problem. Gibt es eine Möglichkeit Netzlaufwerke direkt umzubenennen? Sprich den VolumeLabel wie bei Driveinfo.... jemand eine Idee?
@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.