我正在使用WMI代码创建器来创建添加联网打印机的代码。
http://img13.imageshack.us/img13/9847/wmicodecreatorwin32prin.png
生成的代码效果很好(无论如何都在我的域帐户下):
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class CallWMIMethod
{
public static void Main()
{
try
{
ManagementClass classInstance =
new ManagementClass("root\\CIMV2",
"Win32_Printer", null);
// Obtain in-parameters for the method
ManagementBaseObject inParams =
classInstance.GetMethodParameters("AddPrinterConnection");
// Add the input parameters.
inParams["Name"] = "\\\\PrintServer\\PrinterName";
// Execute the method and obtain the return values.
ManagementBaseObject outParams =
classInstance.InvokeMethod("AddPrinterConnection", inParams, null);
// List outParams
Console.WriteLine("Out parameters:");
Console.WriteLine("ReturnValue: " + outParams["ReturnValue"]);
}
catch(ManagementException err)
{
MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message);
}
}
}
}
但是,我需要将网络打印机添加到本地PC帐户,即无法访问\ PrintServer的非域帐户。
在哪里可以将域用户(服务帐户)用户名和密码放入上述代码?
我一直在谷歌搜索几个小时,但我能找到的只是一个愚蠢的帖子,说明如何在远程机器上添加打印机,这不是我想要做的。
(我需要将远程打印机添加到当前 PC,而不是远程PC。)(需要注意的是登录用户是本地PC帐户。)
有谁知道如何实现这一目标?
答案 0 :(得分:1)
您可以在打印服务器上创建相同的本地帐户,通过这样做启用对等身份验证...
即。 pc1在本地有用户bob1。 使bob1成为打印服务器上的用户。
在pc1上将你的地图程序作为bob1运行,你应该能够到达打印机。
有帮助吗?
否则,网络打印机是每个用户...运行您的程序,因为具有访问权限的域用户(即runas)将无法工作,因为它只是将打印机映射到用户会话而不是您真正想要的那个。
......这个怎么样? http://www.codescript.co.uk/wmi_connect_as_another_user.htm
...还是scriptomatic? http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=12028 (即使它不适用于c#,它仍然可以提供wmi synatx的东西)
答案 1 :(得分:0)
所以,因为其他答案被删除了。我刚测试了这个并且它有效。这是获取我正在使用的课程的链接https://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User 以下代码对我有用。如果你看起来有一些更好的类实现来冒充用户。
static void Main(string[] args)
{
using (new Impersonator("username", "domainName", "myPassword"))
{
// The following code is executed under the impersonated user.
AddPrinterUnc(@"\\PrintServer\printershare");
}
}
public static void AddPrinterUnc(string printUncPath)
{
using (ManagementClass oPrinterClass = new ManagementClass(new ManagementPath("Win32_printer"), null))
{
using (ManagementBaseObject oInputParameters = oPrinterClass.GetMethodParameters("AddPrinterConnection"))
{
oInputParameters.SetPropertyValue("Name", printUncPath);
oPrinterClass.InvokeMethod("AddPrinterConnection", oInputParameters, null);
}
}
}