Вызов функции не может быть оценен по тайм-ауту

Я написал некоторый базовый код на С#, например:

//Connection credentials to the remote computer - not needed if the logged in account has access
ConnectionOptions oConn = new ConnectionOptions();
oConn.Username = "";
oConn.Password = "";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

Где имя пользователя и пароль предоставляются в качестве учетных данных для моей локальной учетной записи рабочего стола.

Когда я добираюсь до строки, где тип ManagementObjectCollection возвращается из метода ManagementObjectSearcher Get(), я получаю сообщение об ошибке (во время выполнения), говорящее о том, что время ожидания вызова функции истекло, когда я пытаюсь оценить эту строку (последняя строка перед циклом foreach).

Исключения нет, поэтому никаких подробностей об ошибке нет.

Как я могу это исправить? Код выглядит хорошо для меня? Этот код находится на другой машине, поэтому я использую код отсюда (в значительной степени следует тем же шагам): http://www.csharphelp.com/archives2/archive334.html

Спасибо


person GurdeepS    schedule 25.07.2009    source источник
comment
Какое точное сообщение об ошибке? Можете ли вы запустить тот же запрос, используя wbemtest?   -  person Mark    schedule 16.09.2009


Ответы (2)


Я получаю это исключение при запуске вашего кода как есть:

System.Management.ManagementException не было обработано Message="Учетные данные пользователя не могут использоваться для локальных подключений" Source="System.Management" ...

Он возникает на строке, где используется oSearcher.Get(), но проблема с WMI-соединением, т.к. делается попытка подключения к локальному компьютеру. Если вы добавите эту строку после инициализации oMs:

Console.WriteLine(oMs.Path.Path);

вывод будет таким (с тем же исключением, что и раньше):

\.\МашинаX

поэтому ваш путь интерпретируется как пространство имен WMI с именем MachineX на локальном (точечном) компьютере. Это связано с правилами экранирования С# - вы можете использовать это для инициализации oMs (без oConn, поскольку учетные данные не могут использоваться для локальных подключений WMI):

System.Management.ManagementScope oMs = 
new System.Management.ManagementScope("\\root\\cimv2");

и вы будете локально подключены к пространству имен Root\Cimv2. Рекомендуется всегда использовать полные пути WMI:

System.Management.ManagementScope oMs = 
new System.Management.ManagementScope(@"\\MachineX\root\cimv2", oConn);
person Community    schedule 26.07.2009

Из ссылки, которую вы дали, я вижу тот же ManagementScope - \MachineX - не должно ли это быть имя вашего локального компьютера - будет ли это соответствовать ошибке (тайм-аут из-за того, что область не найдена)?

person S.Skov    schedule 26.07.2009
comment
Вероятно, можно с уверенностью предположить, что пользователь разместил \MachineX в целях конфиденциальности, они, несомненно, заменят это своим фактическим именем машины... - person James; 26.07.2009
comment
На самом деле я изменил имя машины на соответствующее имя машины, на которой я кодирую, но не повезло. :( Код тот же, изменились все параметры специфичные для моего ПК. - person GurdeepS; 26.07.2009