2013-05-10 25 views
2

我已经创建了一个C#应用程序来重命名Citrix服务器(Server 2008 R2)上的打印机。使用C#和WMI重命名打印机

原因是因为每次用户登录时,打印机都会被转发到服务器并获取唯一的名称(例如会话3中的Microsoft XPS Document Writer(来自WI_UFivcBY4-wgoYOdlQ))以及某些应用程序这是打印机指向名称的问题,因此每次登录会话时都需要更改打印机设置。

程序本身就像一个魅力,打印机得到我想要的名字。 但是,问题在于打印机已重命名后,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

我的东西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和打印机的这个问题的一些interresting细节。我可能是搞乱它的权利[链接](http://www.norskale.com/articles/article/programmatically-rename-xenapp-autocreated-client-printers)再次感谢您的帖子。我会继续我的搜索解决方案,并在这里发帖,因为我发现它! – user2371138 2013-05-12 08:29:15

+0

如[此处](http://www.scriptinternals.com/new/us/support/Internal/WMI_Win32_Printer.htm)所述,代码** 5 **,而不代码** 1 **,用于**拒绝访问** – 2014-12-18 10:19:36

相关问题