c# - Win32_Printer 方法是否在服务器上对本地计算机有效?

标签 c# service printing wmi

我最近制作了一个使用包含WMI Win32_Printer 的WCF 服务的C# 打印机管理工具。类似 AddPrinterConnection 的方法和 SetDefaultPrinter .

如果客户端和 WCF 服务都在同一台机器上运行,则一切正常。但是,如果我尝试在另一台机器上移动 WCF 服务,这些方法会停止工作但不会崩溃。

例如,AddPrinterConnection 返回 0,表示成功,但本地计算机上并未真正添加打印机。默认打印机即使设置为默认值也会返回 false 等。打印机列表可以某种方式访问​​。

即使 WCF 服务以应用程序池的管理员身份托管在 IIS 中或托管在服务器上的 ASP 开发服务器中,其行为也是一样的。

但是在本地机器上使用相同的身份一切都很好。打印机名称和本地机器地址作为参数发送到 WCF 方法。

这是权利、授权或模拟问题吗?这是 WMI 的限制吗?有人遇到过这个问题吗?我真的需要一个解决方案。提前谢谢你。

编辑:这里是一些代码,表示在添加打印机的 WCF 服务上调用的函数。

注意:在本地安装(客户端和服务本地)和远程(客户端本地,服务远程)上,该函数返回 0,这意味着“成功”并且没有错误,但在第二种情况下实际上没有添加任何内容。

我也尝试了各种模拟,正如我所说,运行 WCF 服务的身份与使用客户端的用户相同。我想这是与用户上下文相关的事情,因为它没有多大意义。我试图从 Microsoft 找到一些有关此的信息,但没有成功。

public static string AddPhysicalPrinter(string sPrinterName, string address)
    {
        try
        {
            ConnectionOptions options = new ConnectionOptions();
            options.Impersonation = ImpersonationLevel.Impersonate;
            options.Authentication = AuthenticationLevel.PacketPrivacy;
            options.EnablePrivileges = true;
            options.Username = "username";
            options.Password = "password";

            oManagementScope = new ManagementScope(new ManagementPath("\\\\" + address + "\\root" + "\\cimv2"), options);

            oManagementScope.Connect();

            ManagementClass oPrinterClass = new ManagementClass (new ManagementPath("Win32_Printer"), null);
            ManagementBaseObject oInputParameters = oPrinterClass.GetMethodParameters("AddPrinterConnection");

            oInputParameters.SetPropertyValue("Name", sPrinterName);

           ManagementBaseObject x = oPrinterClass.InvokeMethod("AddPrinterConnection", oInputParameters, null);

            foreach(PropertyData p in x.Properties)
            {
                switch ((UInt32)p.Value)
                {
                    case 0:
                        return "has been added successfuly";//success
                    case 5:
                        return "access denied";//access denied
                    case 1801:
                        return "invalid printer name";//invalid printer name
                    case 1930:
                        return "incompatible printer driver";//incompatible printer driver
                    default:
                        return "unknown error";
                }
            }

            return "unknown error";
        }
        catch (Exception ex)
        {
            return "exception caught";
        }
    }

最佳答案

经过一些研究,我发现不可能从第三台机器上执行此操作。必须使用 local logon 来完成.

关于c# - Win32_Printer 方法是否在服务器上对本地计算机有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9569603/

相关文章:

android - 每分钟运行的服务

android - 每天特定时间通知

应用程序被杀死时的 Android 地理围栏

c# - 在打印作业期间更换打印机托盘

c# - OxyPlot 热图问题 Windows 8.1 通用应用程序 VS 2015 : Plot won't draw

c# - NLog 避免重复行并设置增量时间

python - python中多线程打印函数的意外缩进输出

iPhone - 在一张纸上打印多个图像

c# 加载/保存对象或对象数组

c# - 如何确定CSV文件是否为unicode