Запросы 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, работая без прав администратора.
Надеюсь, это поможет кому-то еще.
Ура все. Кит.