使用C#和WMI重命名打印机
我已经创建了一个C#应用程序来重命名Citrix服务器(Server2008R2)上的打印机 原因是,每次用户登录打印机时,都会被转发到服务器并获得唯一的名称(例如,在会话3中,Microsoft XPS Document Writer(来自WI_UFivcBY4-wgoYOdlQ)在某些应用程序中,这是一个问题,因为打印机指向名称,因此每次登录会话时都需要更改打印机设置 程序本身就像一个魔咒,打印机得到了我想要的名字。 然而,问题是在打印机被重命名之后,Windows似乎再也无法识别它们了。例如,如果我尝试更改默认打印机,我会收到一条错误消息:“错误0x00000709请仔细检查打印机名称,并确保打印机已连接到网络。” 我遗漏了什么吗?重命名时我还需要做什么? 我似乎根本找不到关于这个案子的任何信息。我认为codeproject就是你要找的。但是,在经历了一些自己在使用C#和WMI重命名打印机,c#,printing,wmi,C#,Printing,Wmi,我已经创建了一个C#应用程序来重命名Citrix服务器(Server2008R2)上的打印机 原因是,每次用户登录打印机时,都会被转发到服务器并获得唯一的名称(例如,在会话3中,Microsoft XPS Document Writer(来自WI_UFivcBY4-wgoYOdlQ)在某些应用程序中,这是一个问题,因为打印机指向名称,因此每次登录会话时都需要更改打印机设置 程序本身就像一个魔咒,打印机得到了我想要的名字。 然而,问题是在打印机被重命名之后,Windows似乎再也无法识别它们了。例
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;
}
}
}