C# AddPrinter与Win32_打印机的连接失败
我有一个简单的程序,将特定的打印机连接添加到服务器,并在该打印机上打印pdf文档。打印文档后,打印机连接将被删除 现在,当我以自己的管理员帐户启动应用程序时,一切正常。但当我使用服务用户帐户启动应用程序时,我无法添加打印机连接。它失败,错误代码为87:无效的_参数 注意:如果计算机(服务器)上的打印机连接可用,则我可以使用服务用户帐户进行打印。仅添加不存在的打印机连接不起作用 以下是代码片段:C# AddPrinter与Win32_打印机的连接失败,c#,.net,printing,windows-server,C#,.net,Printing,Windows Server,我有一个简单的程序,将特定的打印机连接添加到服务器,并在该打印机上打印pdf文档。打印文档后,打印机连接将被删除 现在,当我以自己的管理员帐户启动应用程序时,一切正常。但当我使用服务用户帐户启动应用程序时,我无法添加打印机连接。它失败,错误代码为87:无效的_参数 注意:如果计算机(服务器)上的打印机连接可用,则我可以使用服务用户帐户进行打印。仅添加不存在的打印机连接不起作用 以下是代码片段: private static ManagementScope oManagementScope
private static ManagementScope oManagementScope = null;
public static bool AddPrinter(string printerName)
{
var result = false;
try
{
oManagementScope = new ManagementScope(ManagementPath.DefaultPath);
oManagementScope.Connect();
using (ManagementClass win32Printer = new ManagementClass("Win32_Printer"))
{
using (ManagementBaseObject inputParam = win32Printer.GetMethodParameters("AddPrinterConnection"))
{
inputParam.SetPropertyValue("Name", printerName);
using (ManagementBaseObject methodResult = win32Printer.InvokeMethod("AddPrinterConnection", inputParam, null))
{
uint errorCode = (uint)methodResult.Properties["returnValue"].Value;
switch (errorCode)
{
case 0:
Logger.LogInfo("Successfully connected printer.");
result = true;
break;
case 5:
Logger.LogError("Access Denied.");
break;
case 123:
Logger.LogError("The filename, directory name, or volume label syntax is incorrect.");
break;
case 1801:
Logger.LogError("Invalid Printer Name: " + printerName);
break;
case 1930:
Logger.LogError("Incompatible Printer Driver.");
break;
case 3019:
Logger.LogError("The specified printer driver was not found on the system and needs to be downloaded.");
break;
default:
Logger.LogError("Could not add the specific printer, Error Code: " + errorCode);
break;
}
}
}
}
}
catch (Exception ex)
{
Logger.LogError(ex.Message + ", " + ex.InnerException?.Message);
}
return result;
}
我们已经尝试在服务用户上添加与我在管理员帐户上相同的权限。在添加打印机连接时,我仍然得到错误代码87
当我研究了一点错误代码87时,我发现它意味着类似无效参数的东西。但是我不知道哪个参数应该是无效的,为什么当我用我的管理员帐户启动它时,它会在服务器上工作
欢迎任何帮助
谢谢我刚刚学会了如何自己做这一切,而且很有效。 我很好奇你的
inputParam.SetPropertyValue("Name", printerName);
是不是考错了
我只关心网络打印机,就是这样做的
var fullName = $"\\\\{_serverName}\\{_printerName}";
inputParam.SetPropertyValue("Name", fullName);
您刚才说的是什么?我们终于找到了解决此问题的方法,即使这不是最佳做法,但现在效果很好 正如我上面提到的,我们有一个服务帐户,应该动态安装打印机,但不知何故,这不起作用。因此,我们没有创建一个服务用户,而是创建了一个普通用户,它突然工作了
此解决方案的缺点是,此伪用户必须始终登录到服务器上。否则,添加打印机将无法与我们的解决方案配合使用。我也几乎是这样做的,printername类似:\\\\printserver\\printername