C # /. NET: Как добавить сетевой принтер в локальную учетную запись ПК? - PullRequest
8 голосов
/ 06 августа 2011

Я использую 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);
            }
        }
    }
}

Однако мне нужно добавить сетевой принтер в локальную учетную запись ПК, т. Е. Учетную запись не в домене, которая не имеет доступа к \ PrintServer.

Где можноЯ ввел имя пользователя и пароль пользователя домена (служебная учетная запись) в приведенный выше код?

Я часами гуглю, но все, что я могу найти, - это один глупый пост, в котором говорится, как добавить принтер наудаленный компьютер, что я не собираюсь делать.

(мне нужно добавить удаленный принтер к текущему ПК, а не к удаленному ПК.) (Предупреждениечто зарегистрированный пользователь является локальной учетной записью ПК.)

Кто-нибудь знает, как этого можно достичь?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

вы можете создать ту же локальную учетную запись на сервере печати, включив одноранговую аутентификацию, сделав так ...

то есть pc1 локально имеет пользователя bob1.сделайте bob1 пользователем на сервере печати. ​​

запустите программу карты как bob1 на ПК1, и вы сможете получить доступ к принтеру.

это поможет?

в противном случае сетевые принтеры предназначены для каждого пользователя ... запуск вашей программы в качестве пользователя домена, у которого есть доступ (например, runas), не будет работать, поскольку он просто сопоставит принтер с сеансом пользователей, а не с тем, который вам действительно нужен.

... что по этому поводу?http://www.codescript.co.uk/wmi_connect_as_another_user.htm

... или сценарий?http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=12028 (даже если это не для c #, он все равно может дать материал wmi synatx)

0 голосов
/ 21 сентября 2017

Так как другой ответ был удален.Я только что проверил это, и это сработало.Вот ссылка, чтобы получить класс, который я использую 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);

                }
            }

    }
...