Запросы win32_NetworkConnection медленные в Windows 7

Folks,

В течение многих лет я с радостью использовал приведенный ниже метод C# IsNetworkDrive, чтобы определить: "Это сетевой диск?" под Windows XP. Он все еще дает ожидаемый результат под Windows 7, но для каждого звонка требуется порядка 10 секунд... а это примерно в миллион раз больше!

using System;
using System.Collections.Generic;
using System.Management;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var driveName in Environment.GetLogicalDrives())
                Console.WriteLine(driveName + " " + IsNetworkDrive(driveName.Substring(0,2)));
            Console.Write("Press any key to continue ...");
            Console.ReadKey();
        }

        private static bool IsNetworkDrive(string drive)
        {
            var query = @"SELECT Name FROM win32_NetworkConnection WHERE LocalName='" + drive + "'";
            var seacher = new ManagementObjectSearcher(query);
            var resultset = seacher.Get();
            var count = resultset.Count;
            return count == 1;
        }

    }
}

Arrrgggghhhh. Я ненавижу Windows!

У кого-нибудь есть идеи, как [качественно] определить, представляет ли данная буква диска локальный диск или сетевой диск, как в Windows 7, так и в Windows XP (корпоративные SOE)?

[Желательно в.NET <= 3.5, хотя я МОГУ ОБНОВИТЬ проект до 4.0, для этого просто потребуется тест зеленых полей, на который у нас сейчас нет денег. Вздох.]

Ура все. Кит.

1 ответ

Я отвечаю на свой вопрос.

Еще немного прибегая к гуглу, привело меня к этому посту: Как программно обнаружить подключенные сетевые диски в системе и имена их серверов?

И код в этом вопросе приводит меня к: DriveInfo.GetDrives (), который я работаю в мой основной метод:

    static void Main(string[] args) {
        foreach (var driveInfo in DriveInfo.GetDrives())
            Console.WriteLine(driveInfo + " " + driveInfo.DriveType);
        Console.Write("Press any key to continue ...");
        Console.ReadKey();
    }

производить:

C:\ Fixed
D:\ CDRom
E:\ Removable
G:\ Network
H:\ Network
I:\ Network
K:\ Network
L:\ Network
M:\ Network
Q:\ Network
Press any key to continue ...

... и тогда это недалеко от того, чтобы:

    // Example drives: "C:" or "L:" ... just the drive-letter and a colon. No backslash. 
    private static bool IsNetworkDrive(string drive) {
        return new DriveInfo(drive).DriveType == DriveType.Network;
    }

который дает ожидаемые результаты в ожидаемый [субсекундный] период времени под Windows 7, работая без прав администратора.

Надеюсь, это поможет кому-то еще.

Ура все. Кит.

Другие вопросы по тегам