V
veeralp
I have been playing with WMI to add a network printer connection to a
Windows XP pc. My environment consists of a server running Windows
Server 2003 and Visual Studio 2005 and a test pc running windows xp.
Further, I have setup a full domain controller environment.
I have managed to write the code to add the network printer and it
works fine when installing the printer on the same machine the code is
executing from i.e the server or xp pc. However, if I run the code
from the server to install the network printer onto the test pc, it
does not work.
An exception is generated stating "Not Supported, the inner exception
is blank. The exception occurs when the mgtClass.InvokeMethod is
executed, see code.
I can manually install the network printer on the test pc via the
control panel, thus proving that the connectivity between the two
machines is ok.
Questions:
1) If I specifiy the ip address of the test pc in the ManagementScope
object and when an object of Management class is instantiated does
this imply that the network printer will be added to the test pc?
2)Using the AddPrinterConnection method from the WIN32_PRINTER class,
is this the only way to add a network printer ? Or is there an
alternative way I can achieve this.
3) To install the network printer on the server itself, omit the IP
address,ipAddressOfClientPC, of the server from the ManagementScope
object and it installs fine, provided the code itself is running of
the server. So this leads me to believe its an issue with
ManagementScope. Note, if installing on the same machine as the code
is running on then the username and password need not to be defined.
So what do I need to do to the Management Scope object to make it
work?
4) The prnadmin.dll which ships as part of WIndows Server 2003 SDK was
designed to be used with scripting lanuages for programmatic printer
manipulation. Within prnadmin.dll there is a method called
AddPrinterConnectionEx which has the ability to install network
printers on remote pc. My question is that which API is the
AddPrinterConnectionEx calling in order for the network printer to be
installed on a remote computer ?
5)A suggested alternative was this command line method : "rundll32
printui.dll,PrintUIEntry /?" Which api does the printui.dll call
inorder for network printers to be installed on remote computers?
I used the WMI code generated by the WMI Code Generator,
http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e,
I have added my code below.
If you can point me in the right direction as to the mistake I am
making, I would appreciate it.
thanks
Veeral
using System;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
namespace SampleApp
{
public class AddPrinterConnection
{
public static void Main()
{
//only required if need to install network printer on another
machine.
string username = "administrator";
string password = "password";
string ipAddressOfClientPC = "192.168.0.22";
ManagementScope scope = new ManagementScope("\\\\" +
ipAddressOfClientPC + "\\root\\cimv2");
scope.Options.Username = username;
scope.Options.Password = password;
scope.Options.Impersonation = ImpersonationLevel.Impersonate;
scope.Connect();
ManagementPath path = new ManagementPath("Win32_Printer");
ManagementClass mgtClass = new ManagementClass(scope, path, null);
using (mgtClass)
{
try
{
ManagementBaseObject inputParameters =
mgtClass.GetMethodParameters("AddPrinterConnection");
string sharedPrinterAddress = "\\\\192.168.0.1\\printer2";
inputParameters["Name"] = sharedPrinterAddress;
ManagementBaseObject outputParameters =
mgtClass.InvokeMethod("AddPrinterConnection", inputParameters, null);
uint errorCode = (uint)outputParameters["ReturnValue"];
Console.WriteLine(errorCode.ToString());
}
catch (Exception exception)
{
Console.WriteLine(exception.Message + "\n" +
exception.InnerException);
}
Console.ReadLine();
}
}
}
}
Windows XP pc. My environment consists of a server running Windows
Server 2003 and Visual Studio 2005 and a test pc running windows xp.
Further, I have setup a full domain controller environment.
I have managed to write the code to add the network printer and it
works fine when installing the printer on the same machine the code is
executing from i.e the server or xp pc. However, if I run the code
from the server to install the network printer onto the test pc, it
does not work.
An exception is generated stating "Not Supported, the inner exception
is blank. The exception occurs when the mgtClass.InvokeMethod is
executed, see code.
I can manually install the network printer on the test pc via the
control panel, thus proving that the connectivity between the two
machines is ok.
Questions:
1) If I specifiy the ip address of the test pc in the ManagementScope
object and when an object of Management class is instantiated does
this imply that the network printer will be added to the test pc?
2)Using the AddPrinterConnection method from the WIN32_PRINTER class,
is this the only way to add a network printer ? Or is there an
alternative way I can achieve this.
3) To install the network printer on the server itself, omit the IP
address,ipAddressOfClientPC, of the server from the ManagementScope
object and it installs fine, provided the code itself is running of
the server. So this leads me to believe its an issue with
ManagementScope. Note, if installing on the same machine as the code
is running on then the username and password need not to be defined.
So what do I need to do to the Management Scope object to make it
work?
4) The prnadmin.dll which ships as part of WIndows Server 2003 SDK was
designed to be used with scripting lanuages for programmatic printer
manipulation. Within prnadmin.dll there is a method called
AddPrinterConnectionEx which has the ability to install network
printers on remote pc. My question is that which API is the
AddPrinterConnectionEx calling in order for the network printer to be
installed on a remote computer ?
5)A suggested alternative was this command line method : "rundll32
printui.dll,PrintUIEntry /?" Which api does the printui.dll call
inorder for network printers to be installed on remote computers?
I used the WMI code generated by the WMI Code Generator,
http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e,
I have added my code below.
If you can point me in the right direction as to the mistake I am
making, I would appreciate it.
thanks
Veeral
using System;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
namespace SampleApp
{
public class AddPrinterConnection
{
public static void Main()
{
//only required if need to install network printer on another
machine.
string username = "administrator";
string password = "password";
string ipAddressOfClientPC = "192.168.0.22";
ManagementScope scope = new ManagementScope("\\\\" +
ipAddressOfClientPC + "\\root\\cimv2");
scope.Options.Username = username;
scope.Options.Password = password;
scope.Options.Impersonation = ImpersonationLevel.Impersonate;
scope.Connect();
ManagementPath path = new ManagementPath("Win32_Printer");
ManagementClass mgtClass = new ManagementClass(scope, path, null);
using (mgtClass)
{
try
{
ManagementBaseObject inputParameters =
mgtClass.GetMethodParameters("AddPrinterConnection");
string sharedPrinterAddress = "\\\\192.168.0.1\\printer2";
inputParameters["Name"] = sharedPrinterAddress;
ManagementBaseObject outputParameters =
mgtClass.InvokeMethod("AddPrinterConnection", inputParameters, null);
uint errorCode = (uint)outputParameters["ReturnValue"];
Console.WriteLine(errorCode.ToString());
}
catch (Exception exception)
{
Console.WriteLine(exception.Message + "\n" +
exception.InnerException);
}
Console.ReadLine();
}
}
}
}