2013-05-10 3 views
2

Я создал приложение C# для переименования принтеров на сервере Citrix (Server 2008 R2).Переименование принтера с использованием C# и WMI

Причина этого в том, что каждый раз, когда пользователь регистрируется на принтере, он перенаправляется на сервер и получает уникальное имя (например, Microsoft XPS Document Writer (из WI_UFivcBY4-wgoYOdlQ) в сеансе 3) и из некоторых приложений Это проблема, поскольку принтер указывает на имя и тем самым вам нужно изменить настройки принтера при каждом входе в сеанс.

Сама программа работает как шарм, и принтер получает имена, которые я желаю. Однако проблема в том, что принтеры были переименованы в Windows, похоже, больше не могут их идентифицировать. Например, если я пытаюсь изменить принтер по умолчанию, я получаю сообщение об ошибке «Ошибка 0x00000709 Дважды проверьте имя принтера и убедитесь, что принтер подключен к сети».

  var query = new ManagementObjectSearcher("SELECT * FROM Win32_Printer where name like '%(%'"); 

      ManagementObjectCollection result = query.Get(); 

      foreach (ManagementObject printer in result) 
      { 
       string printerName = printer["name"].ToString(); 

       if (printerName.IndexOf('(') > 0) 
       { 
        printer.InvokeMethod("RenamePrinter", new object[] { printerName.Substring(0, printerName.IndexOf('(')).Trim() + " " + userName }); //userName is provided as an inputparameter when running the application 
       } 
      } 

Я ничего не теряю? Есть ли что-то еще, что мне нужно делать при переименовании? Я не могу найти информацию об этом случае вообще.

ответ

1

i вещь this codeproject - это то, что вы ищете. Но после того, как некоторые собственные переживания с принтерами в C# я могу только сказать, что это не высмеивает, и это может быть очень расстраивает

код с небольшими изменениями:

//Renames the printer 
public static void RenamePrinter(string sPrinterName, string newName) 
{ 
    ManagementScope oManagementScope = new ManagementScope(ManagementPath.DefaultPath); 
    oManagementScope.Connect(); 

    SelectQuery oSelectQuery = new SelectQuery(); 
    oSelectQuery.QueryString = @"SELECT * FROM Win32_Printer WHERE Name = '" + sPrinterName.Replace("\\", "\\\\") + "'"; 

    ManagementObjectSearcher oObjectSearcher = 
     new ManagementObjectSearcher(oManagementScope, oSelectQuery); 
    ManagementObjectCollection oObjectCollection = oObjectSearcher.Get(); 

    if (oObjectCollection.Count == 0) 
     return; 

    foreach (ManagementObject oItem in oObjectCollection) 
    { 
     int state = (int)oItem.InvokeMethod("RenamePrinter", new object[] { newName }); 
     switch (state) 
     { 
      case 0: 
       //Success do noting else 
       return; 
      case 1: 
       throw new AccessViolationException("Access Denied"); 
      case 1801: 
       throw new ArgumentException("Invalid Printer Name"); 
      default: 
       break; 
     } 
    } 
} 
+0

Здравствуйте Спасибо за ваш ответ. Я уже использовал эту страницу для справки. Я чувствовал, что это может быть хлопот. Однако я нашел некоторые интересные данные по этому вопросу с помощью citrix и принтеров по этой ссылке. Я мог бы быть прав, которые запутывают его [ссылка] (http://www.norskale.com/articles/article/programmatically-rename-xenapp-autocreated-client-printers) Снова спасибо за сообщение. Я продолжу поиск hte-решения и опубликую здесь, как соны, как я его найду! – user2371138

+0

как указано [здесь] (http://www.scriptinternals.com/new/us/support/Internal/WMI_Win32_Printer.htm), код ** 5 **, а не код ** 1 **, для ** Доступ закрыт** –