【发布时间】:2012-03-05 15:49:18
【问题描述】:
我最近制作了一个 c# 打印机管理工具,它使用 WCF 服务,其中包含 WMI Win32_Printer 方法,如 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";
}
}
【问题讨论】:
-
您可以发布任何代码吗?您几乎肯定需要为此使用模拟。
-
好的,我添加了一些代码和进一步的解释。希望对您有所帮助。