2009-07-25 9 views
1

j'ai écrit un code de base en C# comme ceci:appel de fonction n'a pas pu être évalué a expiré

//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()); 
} 

Lorsque le nom d'utilisateur et mot de passe sont fournis les informations d'identification pour mon compte de bureau local.

Lorsque j'arrive à la ligne où le type ManagementObjectCollection est renvoyé à partir de la méthode ManagementObjectSearcher Get(), j'obtiens une erreur (à l'exécution) indiquant que l'appel de fonction a expiré lorsque j'essaie d'évaluer cette ligne boucle).

Il n'y a pas d'exception, donc plus de détails sur l'erreur.

Comment puis-je résoudre ce problème? Le code me va bien? Ce code est sur une autre machine, donc je suis en utilisant le code d'ici (suit à peu près les mêmes étapes): http://www.csharphelp.com/archives2/archive334.html

Merci

+0

Quel est le message d'erreur exact? Pouvez-vous exécuter la même requête en utilisant wbemtest? – Mark

Répondre

1

De la référence de lien que vous avez donné, je vois le même ManagementScope - \ Machinex - shouldn ce n'est pas le nom de votre machine locale à la place - serait compatible avec l'erreur (délai d'expiration pour ne pas trouver la portée)?

+0

Il est probablement prudent de supposer que l'utilisateur a posté "\ MachineX" pour des raisons de confidentialité, il remplacera sans doute son nom de machine par le nom de la machine ... – James

+0

J'ai changé le nom de la machine en le nom de la machine Je suis en train de coder, mais pas de chance. :(Le code est le même, tous les paramètres spécifiques à mon PC ont changé. – dotnetdev

2

je reçois cette exception lors de l'exécution de votre code tel qu'il est:

System.Management.ManagementException était unhandled message = "informations d'identification d'utilisateur ne peuvent pas être utilisés pour les connexions locales" source = "System.Management" .

Il est déclenché sur la ligne où oSearcher.Get() est utilisé, mais le problème de connexion WMI, car une tentative de connexion à l'ordinateur local est effectuée. Si vous ajoutez cette ligne après l'initialisation de oms:

Console.WriteLine(oMs.Path.Path); 

la sortie sera comme celui-ci (avec la même exception que précédemment).

\ \ Machinex

de sorte que votre chemin est interprété comme L'espace de noms WMI nommé MachineX sur la machine locale (dot). Cela est dû à C# règles qui s'échappent - vous pouvez l'utiliser pour l'initialisation oms (sans oConn, car les informations d'identification ne peuvent pas être utilisés pour les connexions WMI locales):

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

et vous seraient connectés à l'espace de noms Root \ Cimv2 localement . Il est recommandé de toujours utiliser les chemins WMI complets:

System.Management.ManagementScope oMs = 
new System.Management.ManagementScope(@"\\MachineX\root\cimv2", oConn); 
Questions connexes