使用C#和WMI重命名打印机

时间:2013-05-10 19:01:11

标签: c# printing wmi

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

这是因为每次用户登录打印机都会转发到服务器并获得一个唯一的名称(例如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 个答案:

答案 0 :(得分:2)

我的this代码项目就是你要找的东西。但是在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;
        }
    }
}