我创建了一个C#应用程序来重命名Citrix服务器(Server 2008 R2)上的打印机。
这样做的原因是因为每次用户登录打印机时,都会转发到服务器并获得唯一的名称(例如,会话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
}
}
我有什么想念的吗?重命名时我还有什么需要做的吗?
我似乎根本找不到关于此案的任何信息。
最佳答案
我的东西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;
}
}
}
关于c# - 使用C#和WMI重命名打印机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16489121/