Win32_Printer 的 AddPrinterConnection 失败
AddPrinterConnection with Win32_Printer fails
我有一个简单的程序,可以将特定的打印机连接添加到服务器并在该打印机上打印 pdf 文档。打印文档后,打印机连接将被删除。
现在,当我以自己的管理员帐户启动应用程序时,一切正常。但是当我使用服务用户帐户启动应用程序时,我无法添加打印机连接。它失败并显示错误代码 87:INVALID_PARAMETER
注意:如果机器(服务器)上的打印机连接可用,那么我可以使用服务用户帐户进行打印。仅添加不存在的打印机连接不起作用。
这是代码片段:
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);
你传递了什么?
我们终于找到了这个问题的解决方案,即使它不是最佳实践,但现在可以正常工作。
正如我上面提到的,我们有一个应该动态安装打印机的服务帐户,但不知何故这不起作用。因此,我们没有创建服务用户,而是创建了一个普通用户,它突然起作用了。
此解决方案的缺点是,此伪用户必须始终在服务器上登录。否则添加打印机将无法使用我们的解决方案。
我有一个简单的程序,可以将特定的打印机连接添加到服务器并在该打印机上打印 pdf 文档。打印文档后,打印机连接将被删除。
现在,当我以自己的管理员帐户启动应用程序时,一切正常。但是当我使用服务用户帐户启动应用程序时,我无法添加打印机连接。它失败并显示错误代码 87:INVALID_PARAMETER
注意:如果机器(服务器)上的打印机连接可用,那么我可以使用服务用户帐户进行打印。仅添加不存在的打印机连接不起作用。
这是代码片段:
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);
你传递了什么?
我们终于找到了这个问题的解决方案,即使它不是最佳实践,但现在可以正常工作。
正如我上面提到的,我们有一个应该动态安装打印机的服务帐户,但不知何故这不起作用。因此,我们没有创建服务用户,而是创建了一个普通用户,它突然起作用了。
此解决方案的缺点是,此伪用户必须始终在服务器上登录。否则添加打印机将无法使用我们的解决方案。