C#/.NET:如何将网络打印机添加到本地PC账户?

8

我正在使用WMI Code Creator创建代码以添加网络打印机。

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帐户。)
有人知道如何实现这一点吗?

最好在PrintServer上启用Guest账户。 - Skomski
2个回答

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语法的内容)


很遗憾,我没有权限修改打印服务器上的用户或用户访问权限;我只有读取权限(我的域帐户)。我会查看那些链接,但只是想回应一下并看看是否有其他建议。 - JohnnyRockets
也许 net use 命令可以作为另一个用户进行打印机映射?http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/2000/Q_23440726.html - Justin C
如果您无法访问链接,他们使用的示例是 - NET USE lpt1“\ \ ws44a03 \ HP Lj1300”/user:user user /PERSISTENT:YES - Justin C
我找到了一些信息,支持“skomski”之前提到的关于打印机上的访客账户的评论。 - Justin C
老实说,我认为你需要与那些可以访问打印服务器的人合作。 - Justin C
1
谢谢Justin!Net use是一个适当的解决方案。为了全面披露,帮助他人,以下是我在程序中使用的完整命令: System.Diagnostics.Process.Start("net", @"use \printServer /user:domain\username password");(注意,“net”和参数之间的分隔符是必要的!希望这可以帮助其他人节省一些沮丧和时间哈哈)。我想现在可能无法通过C#实现这一点(?),但暂时可以用这个方法。再次感谢! - JohnnyRockets

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);

                }
            }

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接