2013-05-03 1 views
1

J'écris une application pour vérifier si une imprimante réseau d'un serveur d'impression est connectée à une machine distante, mais qu'elle a des problèmes avec la partie distante ... J'utilise System.Printing et en transmettant le nom d'hôte/adresse IP distant via la variable 'compID'. Le problème que je vais avoir est que le code renvoie toujours les imprimantes en réseau sur ma machine locale plutôt que la machine distante:C# - Énumération des imprimantes réseau sur la machine distante

EnumeratedPrintQueueTypes[] compEnumerationFlags = { EnumeratedPrintQueueTypes.Connections }; 

PrintServer compPrinters = new PrintServer("\\\\" + compID); 
PrintQueueCollection printQueuesOnComputer = compPrinters.GetPrintQueues(compEnumerationFlags); 

List<string> compPrinterList = new List<string>(); 

foreach (PrintQueue printer in printQueuesOnComputer) 
    { 
     compPrinterList.Add(printer.Name); 
    } 

string csv = string.Join("\n", compPrinterList.ToArray()); 
Microsoft.VisualBasic.Interaction.MsgBox(csv); 

Pardonne le peu en désordre à la fin là-bas, mais il est juste un moyen rapide et sale moi de voir quels sont les résultats pour le moment. Ce qui est étrange, c'est que si je change la variable 'compID' en notre serveur d'impression et change les drapeaux de 'Connexions' en 'Partagé', alors le code retourne avec succès toutes les imprimantes partagées de notre serveur d'impression. Tout cela fonctionne en tant qu'administrateur sur notre domaine, ce qui ne devrait pas poser de problème ici.Y a-t-il quelque chose de simple que je néglige ou y at-il une sorte de restriction sur les types de machines auxquelles je peux me connecter avec PrintServer? ?

+0

Où installez-vous compID? – TheKingDave

+0

A partir d'une zone de texte plus tôt. Mais même si je code en dur une adresse IP/nom d'hôte dans "PrintServer compPrinters = new PrintServer (" \\\\ xxx.xxx.xxx.xxx ");" - alors je reçois exactement le même problème – cmode

+0

Alors est doit être les drapeaux? Vous avez dit: Ce qui est étrange, c'est que si je change la variable 'compID' en notre serveur d'impression et change les drapeaux de 'Connexions' en 'Partagé', alors le code retourne toutes les imprimantes partagées de notre serveur d'impression. – TheKingDave

Répondre

0

Donc, j'ai une solution de contournement qui semble faire le travail assez bien après un peu de test.Les imprimantes auraient été connectées à la machine à un certain point en utilisant rundll32 printui.dll,PrintUIEntry /ga /c\\%computername% /n\\%printserver%\%printername%

Dans l'application, je l'ai importé printui.dll:

[DllImport("printui.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
     private static extern void PrintUIEntryW(IntPtr hwnd, IntPtr hinst, string lpszCmdLine, int nCmdShow); 

Puis plus tard, j'utilise le drapeau /ge sur la machine distante à la liste toutes les connexions par machine, sortie qui dans un fichier texte temporaire, puis vérifiez pour voir si le nom de l'imprimante est contenue dans le fichier texte:

PrintUIEntryW(IntPtr.Zero, IntPtr.Zero, "/c \\\\" + compID + " /ge /q /f c:\\temp\\printers.txt", 0); 

string file = File.ReadAllText("c:\\temp\\printers.txt"); 
if (file.Contains(printerID)) 
{ 
    exist = true; 
} 
File.Delete("c:\\temp\\printers.txt"); 

Je suis conscient que ce n'est probablement pas la meilleure façon de s'y prendre, mais il semble fonctionner dans l'environnement je fonctionne, donc Je fournis cela comme une réponse.

Questions connexes