【问题标题】:Renaming Printer using C# and WMI使用 C# 和 WMI 重命名打印机
【发布时间】:2013-05-10 19:01:10
【问题描述】:

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

这是因为每次用户登录打印机时都会被转发到服务器并获得一个唯一的名称(例如,会话 3 中的 Microsoft XPS 文档编写器(来自 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
                }
            }

我错过了什么吗?重命名时我还需要做什么吗? 我似乎根本找不到有关此案的任何信息。

【问题讨论】:

    标签: c# printing wmi


    【解决方案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;
            }
        }
    }
    

    【讨论】:

    • 您好!感谢您的回答。我已经使用该页面作为参考。我确实感觉到这可能很麻烦。但是,我在此链接上发现了有关 citrix 和打印机的一些有趣的细节。我可能是把它搞砸的权利link 再次感谢您的帖子。我将继续寻找 hte 解决方案,并在找到后立即在此处发布!
    • here 所述,代码5,而不是代码1,用于拒绝访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多