Installation d'une imprimante USB avec WMI

Signaler
Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
-
 cadweb -
Bonjour,
j'ai réalisé un petit bout de code qui permet d'installer une imprimante sur un port USB.
Cette petite appli attend que l'utilisateur branche son imprimante sur le port USB pour l'installer sur le bon port. Pour cela, je désactive temporairement le lancement automatique du Wizard d'installation des imprimantes.
on imprimante s'installe correctement sur le port USB.
Le souci, c'est que lorsque je l'éteint puis la rallume, Windows me demande d'installer une nouvelle imprimante...
Visiblement la fonction "AddPrinter" de WMI ne fait pas tout et j'aurais aimé un coup de main pour corriger ce petit probleme.
merci d'avances
Je joint ci dessous le code...

private void Button_Click_2(object sender, RoutedEventArgs e)
{
_fin = false;
ManagementEventWatcher w = null;
WqlEventQuery q;
ManagementOperationObserver observer = new ManagementOperationObserver();
// Bind to local machine
ManagementScope scope = new ManagementScope("root\\CIMV2");
scope.Options.EnablePrivileges = true; //sets required privilege
try
{
//Lancement de l'écoute des évènements sur le port USB
q = new WqlEventQuery();
q.EventClassName = "__InstanceOperationEvent";
q.WithinInterval = new TimeSpan(0, 0, 3);
q.Condition = @"TargetInstance ISA 'Win32_PnPEntity' ";

w = new ManagementEventWatcher(scope, q);
w.EventArrived += new EventArrivedEventHandler(UsbEventArrived);
w.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
_nomImprimante = string.Empty;
_port = string.Empty;
DateTime waitForAction = DateTime.Now;
while (!_fin)
{
if ((DateTime.Now - waitForAction).TotalSeconds > 30)
{
//On attend un max de 30 seconds, si rien ne se passe, on arrete
break;
}
}
w.Stop();
if (!string.IsNullOrEmpty(_nomImprimante) && !string.IsNullOrEmpty(_port))
{
//Ajout de l'imprimante
MessageBox.Show(AjouterImprimante("Generic / Text Only", _port, _nomImprimante, "la bas"));
}
}
}

public void UsbEventArrived(object sender, EventArrivedEventArgs e)
{
foreach (PropertyData pd in e.NewEvent.Properties)
{
ManagementBaseObject mbo = null;
if ((mbo = pd.Value as ManagementBaseObject) != null)
if (mbo.Properties["Service"] != null)
{
string service = mbo.Properties["Service"].Value as string;
if (service != "usbprint")
{
_deviceID = mbo.Properties["PNPDeviceID"].Value.ToString();
if (_deviceID.StartsWith("USBPRINT"))
{
//On vient de brancher ou d'allumer une imprimante
_nomImprimante = mbo.Properties["Name"].Value.ToString() ;
string[] tabDevice = _deviceID.Split('&');
_port = tabDevice[tabDevice.Count() - 1];
string Port = mbo.Properties["PNPDeviceID"].Value.ToString();
}
}
}
}
}
}
_fin = true;
}

public string AjouterImprimante(string driver, string port, string nom, string emplacement)
{
string nomImprimante = string.Empty;
ConnectionOptions connectionOptions;
ManagementPath managementPath;
ManagementScope managementScope;
ManagementObject printer;
PutOptions putOptions;


if (driver null || driver "")
throw new ArgumentNullException(driver, "Le nom du driver ne peut pas être vide");


if (port == null || port== "")
throw new ArgumentNullException(port, "Le nom du port ne peut pas être vide");


if (nom null || nom "")
throw new ArgumentNullException(nom, "Le nom de l'imprimante ne peut pas être vide");


if (emplacement null || emplacement "")
throw new ArgumentNullException(emplacement, "L'emplacement ne peut pas être vide");



try
{
connectionOptions = new ConnectionOptions();
connectionOptions.EnablePrivileges = true;


managementPath = new ManagementPath("Win32_Printer");
managementScope = new ManagementScope("\\root\\CIMV2", connectionOptions);
printer = new ManagementClass(managementScope, managementPath, null).CreateInstance();

printer.SetPropertyValue("DriverName", driver);
printer.SetPropertyValue("PortName", port);
printer.SetPropertyValue("DeviceID", nom);
printer.SetPropertyValue("Location", emplacement);
printer.SetPropertyValue("Network", false);
printer.SetPropertyValue("Shared", false);

putOptions = new PutOptions();
putOptions.Type = PutType.UpdateOrCreate;


printer.Put(putOptions);
//Si on arrive ici, c'est que l'imprimante a bien été créée.
nomImprimante = nom;
}
catch (Exception)
{
throw;
}
return nomImprimante;
}

Pat

 Don't Worry , Be Happy

lorsque le problème est résolu, pensez Réponse Acceptée

1 réponse

ça arrive un peu tard mais bon,

je pense que si l'installation de l'imprimante est bloquée (comment d'ailleurs ?), le port n'est pas créé, et comme le port n'est pas créé par le printer.put() ça ne fonctionne pas.



cadweb