Avatar billede rumbassen Nybegynder
14. juli 2005 - 09:38 Der er 7 kommentarer og
1 løsning

Finde ud af hvilke drev der er i en computer c:\ d:\ mm.

Hej
Kan i hjælpe mig med hvordan jeg kan finde ud af hvilke drev der er i en computer fx. c:\  d:\ osv. i en win application.
Jeg har kigget på File.Exists() men kan ikke fådet til at virke på drev.
Det store tillægs spørgsmål kommer så: hvordan er jeg sikker på at det kun er drev på den lokale hd og ikke CD drev, netværksdrev...
Avatar billede arne_v Ekspert
14. juli 2005 - 09:43 #1
Der er en klasse i .NET 2.0 til det: System.IO.DriveInfo

For .NET 1.1 må du bruge noget Win32 API:

using System;
using System.Text;
using System.Runtime.InteropServices;

public class MainClass
{
    [DllImport("kernel32.dll")]
    public static extern int GetDriveType(string driveLetter);
    [DllImport("kernel32.dll")]
    public static extern int GetVolumeInformation(string strPathName,
                                                  StringBuilder strVolumeNameBuffer,
                                                  int lngVolumeNameSize,
                                                  int lngVolumeSerialNumber,
                                                  int lngMaximumComponentLength,
                                                  int lngFileSystemFlags,
                                                  StringBuilder strFileSystemNameBuffer,
                                                  int lngFileSystemNameSize);

    public static string GetDiskType(string drive) {
        switch(GetDriveType(drive)) {
            case 2:
                return "floppy";
            case 3:
                return "harddisk";
            case 4:
                return "networkdrive";
            case 5:
                return "CD";
            default:
                return "unknown";
        }
    }
    public static string GetDiskLabel(string drive)
    {
        StringBuilder volnam = new StringBuilder(256);
        StringBuilder fsnam = new StringBuilder(256);
        int serial = 0;
        int maxfnlen = 0;
        int flags = 0;
        GetVolumeInformation(drive + "\\",
                    volnam,
                    256,
                    serial,
                    maxfnlen,
                    flags,
                    fsnam,
                    256);
        return volnam.ToString();
    }
    public static void test(string drive)
    {
        Console.WriteLine(drive + " " + GetDiskType(drive) + " " + GetDiskLabel(drive));
    }
    public static void Main(string[] args)
    {
        test("A:");
        test("C:");
        test("D:");
        test("E:");
        test("F:");
    }
}
Avatar billede rumbassen Nybegynder
14. juli 2005 - 10:06 #2
Det er helt perfekt. det er lige hvad jeg skulle bruge!! :-) Læg du bare et svar :-)
Avatar billede arne_v Ekspert
14. juli 2005 - 10:24 #3
ok
Avatar billede rumbassen Nybegynder
14. juli 2005 - 13:03 #4
Arne, har du også en ide til hvordan jeg kan finde ud af hvilke drev en anden pc har over netværker med denne kode, hvis jeg har en administrativ bruger som har adgang til denne pc? selv om mit lille program ligger lokalt på min PC.
Avatar billede arne_v Ekspert
14. juli 2005 - 18:44 #5
ingen anelse
Avatar billede rumbassen Nybegynder
15. juli 2005 - 07:32 #6
jeg har fået en stump VB kode der kan gøre det, men jeg skal gerne have det til at virke i C#. Enten at kalde dette script med et parameter og kunne tage imod den strend det retunerer eller få det skrevet om til C#. Er det noget du kan hjælpe med?
du skal nok få nogle flere points for det!

VB:
args = WScript.Arguments.Count
if args = 0 then
pc="localhost"
else
pc=wscript.arguments.item(0)
end if

On Error Resume Next
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & pc & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
if objDisk.Description = "Local Fixed Disk" Then
  drev=drev+objDisk.DeviceID+";"
end if
Next
wscript.echo drev
Avatar billede arne_v Ekspert
15. juli 2005 - 08:03 #7
Jeg ved at .NET har indbygget support for WMI, så koden bør kunne konverteres.

Jeg har aldrig selv brugt WMI, men jeg kan da godt prøve at researche lidt.
Avatar billede rumbassen Nybegynder
15. juli 2005 - 08:11 #8
Jeg fandt lige dette her jeg kan køre det lille script med :-) så nu skal jeg bare trimme lidt så det er snildt

using System.Diagnostics

ProcessStartInfo info = new ProcessStartInfo("cscript", "enum_logical_drives.vbs PCNavn");
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
Process proc = new Process();
proc.StartInfo = info;
proc.Start();
string output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
System.Windows.Forms.MessageBox.Show(output);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester