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);

你传递了什么?

我们终于找到了这个问题的解决方案,即使它不是最佳实践,但现在可以正常工作。

正如我上面提到的,我们有一个应该动态安装打印机的服务帐户,但不知何故这不起作用。因此,我们没有创建服务用户,而是创建了一个普通用户,它突然起作用了。

此解决方案的缺点是,此伪用户必须始终在服务器上登录。否则添加打印机将无法使用我们的解决方案。