C# AddPrinter与Win32_打印机的连接失败

C# AddPrinter与Win32_打印机的连接失败,c#,.net,printing,windows-server,C#,.net,Printing,Windows Server,我有一个简单的程序,将特定的打印机连接添加到服务器,并在该打印机上打印pdf文档。打印文档后,打印机连接将被删除 现在,当我以自己的管理员帐户启动应用程序时,一切正常。但当我使用服务用户帐户启动应用程序时,我无法添加打印机连接。它失败,错误代码为87:无效的_参数 注意:如果计算机(服务器)上的打印机连接可用,则我可以使用服务用户帐户进行打印。仅添加不存在的打印机连接不起作用 以下是代码片段: private static ManagementScope oManagementScope

我有一个简单的程序,将特定的打印机连接添加到服务器,并在该打印机上打印pdf文档。打印文档后,打印机连接将被删除

现在,当我以自己的管理员帐户启动应用程序时,一切正常。但当我使用服务用户帐户启动应用程序时,我无法添加打印机连接。它失败,错误代码为87:无效的_参数

注意:如果计算机(服务器)上的打印机连接可用,则我可以使用服务用户帐户进行打印。仅添加不存在的打印机连接不起作用

以下是代码片段:

    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