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

使用C#和WMI重命名打印机,c#,printing,wmi,C#,Printing,Wmi,我已经创建了一个C#应用程序来重命名Citrix服务器(Server2008R2)上的打印机 原因是,每次用户登录打印机时,都会被转发到服务器并获得唯一的名称(例如,在会话3中,Microsoft XPS Document Writer(来自WI_UFivcBY4-wgoYOdlQ)在某些应用程序中,这是一个问题,因为打印机指向名称,因此每次登录会话时都需要更改打印机设置 程序本身就像一个魔咒,打印机得到了我想要的名字。 然而,问题是在打印机被重命名之后,Windows似乎再也无法识别它们了。例

我已经创建了一个C#应用程序来重命名Citrix服务器(Server2008R2)上的打印机

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

程序本身就像一个魔咒,打印机得到了我想要的名字。 然而,问题是在打印机被重命名之后,Windows似乎再也无法识别它们了。例如,如果我尝试更改默认打印机,我会收到一条错误消息:“错误0x00000709请仔细检查打印机名称,并确保打印机已连接到网络。”

我遗漏了什么吗?重命名时我还需要做什么? 我似乎根本找不到关于这个案子的任何信息。

我认为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和打印机有关的询问细节。我可能是权利,这是混乱的再次感谢你的帖子。我将继续我的hte解决方案搜索和张贴在这里,只要我找到它!如上所述,代码5(而非代码1)用于拒绝访问
//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;
        }
    }
}