C #/. NET: Sådan tilføjes netværksprinter til en lokal pc-konto?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger WMI Code Creator til at oprette kode for at tilføje en netværksprinter.


http://img13.imageshack.us/img13/9847/wmicodecreatorwin32prin.png[3]


Koden, der blev genereret, fungerer godt (under min domæne konto alligevel):


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





Jeg skal dog tilføje en netværksprinter til en lokal pc-konto, dvs. en ikke-domæne-konto, der ikke har adgang til \ PrintServer.


Hvor kan jeg indsætte en domænebruger s (en servicekonto) brugernavn og adgangskode i ovennævnte kode?


Jeg har været Googling i flere timer, men alt jeg kan finde er det dumme indlæg, der siger, hvordan man tilføjer en printer på en fjernmaskine, hvilket ikke er det, jeg søger.


(Jeg skal tilføje en fjernprinter til nuværende -computeren, ikke til en fjerncomputer.) (Advarslen er, at den logget bruger er en lokal pc-konto.)


Er der nogen der ved, hvordan dette kan opnås?

Bedste reference


du kan oprette den samme lokale konto på printernetkortet, hvilket gør det muligt at godkende peer-to-peer-godkendelse ved at gøre det ...


dvs. pc1 har bruger bob1 lokalt.
gør bob1 til en bruger på printerserveren.


Kør dit kortprogram som bob1 på pc1, og du skal kunne komme til printeren.


hjælper det?


ellers er netværksprintere pr. bruger ... kører dit program, da domænebrugeren, der har adgang (dvs. runas), ikke ville arbejde, da det blot ville kortlægge printeren til brugerens session og ikke den, du rent faktisk vil have.


...hvad med det her?
http://www.codescript.co.uk/wmi\_connect\_as\_another\_user.htm[4]


... eller scriptomatic?
http://www.microsoft.com/download/en/details.aspx?DisplayLang=enu0026amp;id=12028
(selv om det ikke er for c #, kan det stadig give wmi synatx stuff) [5]

Andre referencer 1


Så siden andet svar blev fjernet. Jeg har lige testet dette, og det fungerede. Her er link for at få den klasse jeg bruger https://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User
Her er koden nedenfor, som fungerede for mig. Hvis du ser der er nogle endnu bedre implementeringer af klasser derude for at efterligne brugere. [6]


    static void Main(string[] args)
    {

        using (new Impersonator("username", "domainName", "myPassword"))
        {
            // The following code is executed under the impersonated user.
            AddPrinterUnc(@"\PrintServerprintershare");
        }


    }

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

                }
            }

    }