Win32_Printer方法是否可以从服务器端到本地计算机?

时间:2012-03-05 15:49:19

标签: c# service printing wmi

我最近制作了一个c#打印机管理工具,该工具使用的WCF服务包含WMI Win32_PrinterAddPrinterConnectionSetDefaultPrinter方法。

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

例如,AddPrinterConnection返回0表示成功,但本地计算机上没有真正添加打印机。默认打印机即使设置为默认值也会返回false等。打印机列表在某种程度上是可访问的。

即使在IIS中托管具有应用程序池的管理员标识或托管在服务器上的ASP开发服务器中,WCF服务的行为也相同。

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

这是权利,授权还是假冒问题?这是WMI的限制吗?有人遇到过这个问题吗?我真的需要一个解决方案。提前谢谢。

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

注意:在本地安装(客户端和本地服务)和远程(客户端本地,服务远程)上,该函数返回0,这意味着"成功"并没有错误,但在第二种情况下没有真正添加。

我也尝试了所有类型的模仿,正如我所说,运行WCF服务的身份与使用客户端的用户相同。我习惯是与用户上下文相关的事情,因为它没有多大意义。我试图从微软那里找到一些关于此的信息,但没有运气。

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";
        }
    }

1 个答案:

答案 0 :(得分:0)

经过一些研究后我发现不可能从第三台机器上做到这一点。必须使用local logon