druckertreiber version auslesen

coolazid

Grünschnabel
Und wohin soll ich das scheiben, wenn ich es in OnButtonClick Ereignis schreibe bekomm ich Compilerfehler.
 

coolazid

Grünschnabel
Ich hab mal in der WMI weitergesucht.
Laut Win32_PnPSignedDriver hat der Druckertreiber folgende Version:

"2:4.00,2:500,2:5.1"

So, wenn ich aber über "Drucker und Faxgeräte" über Eigenschaften nach der
Treiberversion suche, finde ich als Version "1.56".

Über die WMI ist es relativ einfach an die Informationen zu kommen, aber leider
haben die Versionen andere Werte.

Auf MSDN finde ich keine Management Klasse, in der die "Treiberversion" noch steht.
Kennt vllt jemand ne Klasse in der die richtige Treiberversion steht?

MfG
Alex
 

coolazid

Grünschnabel
Servus Leute,

also ich hab mich weiterhin mit meinem Problem geschäftig und hab endlich ne Lösung gefunden.

Ich benutze jetzt die WMI um die installierten Drucker auszulesen und ihnen den Pfad zu ihren Treibern zuzuordnen.
Das Problem war: In Win32_Printer stehen die Namen der Drucker, die momentan bei "Drucker und Faxgeräte" angezeigt werden. Und in Win32_PrinterDriver stehen anscheinend die Namen der Drucker, die schonmal installiert waren.
Also habe ich über Win32_Printer ein array erstellt in dem alle Drucker aus "Drucker und Faxgeräte" stehen. Dann habe ich noch 2 arrays über Win32_PrinterDriver, in denen einmal alle Namen und dann alle Pfade aus Win32_PrinterDriver stehen. Dann werden die Namen aus Win32_Printer mit denen aus Win32_PrinterDriver verglichen und bei Übereinstimmung wird den Namen aus Win32_Printer ein Treiberpfad zugeordnet.

Jetzt da ick zu jedem Drucker aus "Drucker und Faxgeräte" einen Treiberpfad habe, kann ich einfach aus jeder *.dll die FileVersion auslesen uns somit die Treiberversion. Die wird dann auch noch in ein array gepackt und dann können alle Infos ins ListView eingetragen werden.


Es muss ein Verweis zu System.Managemt.dll hinzugefügt werden!
Code:
using System.Management;
using System.Diagnostics;

#region holt drucker informationen
private void Printer()
{
	#region anzahl der drucker holen
	ManagementClass anzahlMC = new ManagementClass("Win32_Printer");
	ManagementObjectCollection anzahlMOC = anzahlMC.GetInstances();
	int ianzahl = anzahlMOC.Count;
	#endregion
		
        #region anzahl der druckertreiber holen
	ManagementClass treiberanzahlMC = new ManagementClass("Win32_PrinterDriver");
	ManagementObjectCollection treiberanzahlMOC = treiberanzahlMC.GetInstances();
	int itreiberanzahl = treiberanzahlMOC.Count;
	#endregion

        #region druckernamen in array packen
	string[] druckername = new string [ianzahl];
	ManagementClass namenMC = new ManagementClass("Win32_Printer");
	ManagementObjectCollection namenMOC = namenMC.GetInstances();
	int inamen = 0;
	foreach ( ManagementObject namenMO in namenMOC)
	{
		druckername [inamen] = namenMO["DriverName"].ToString();
		inamen++;
	}
	#endregion

	#region treibername und -pfad in arrays packen

	string [] treibername = new string[itreiberanzahl];
	string [] treiberpfad = new string[itreiberanzahl];
	string strtrenner = ",";
	char [] trenner = strtrenner.ToCharArray();
				
	ManagementClass treiberMC = new ManagementClass("Win32_PrinterDriver");
	ManagementObjectCollection treiberMOC = treiberMC.GetInstances();
	int ipfad = 0;
	foreach ( ManagementObject treiberMO in treiberMOC)
	{
		string vollername = treiberMO["Name"].ToString();
		string [] split = vollername.Split(trenner,2);
		split [1] = treiberMO["DriverPath"].ToString();
		treibername[ipfad] = split[0].ToString();
		treiberpfad[ipfad] = split[1].ToString();
		ipfad++;
	}
	#endregion

	#region jedem drucker treiberpfad zuordnen
	string[] druckerpfad = new string [druckername.Length];
	for (int i1=0; i1<druckername.Length; i1++)
	{
		for (int i2=0; i2<treibername.Length; i2++)
		{
			if (druckername[i1].Equals(treibername[i2]))
			{
				druckerpfad[i1] = treiberpfad[i2];
			}
		}
	}
	#endregion

	#region treiberversion in array packen
	string[] treiberversion = new string[druckername.Length];
	for(int i=0; i<druckername.Length; i++)
	{
		FileVersionInfo tversion = FileVersionInfo.GetVersionInfo(druckerpfad[i]);
		treiberversion[i] = tversion.FileVersion;
	}
	#endregion

	#region infos ins listview packen
	ListViewItem item0 = new ListViewItem("Drucker");
	hwlistview.Items.Add(item0);
	ManagementClass fertigMC = new ManagementClass("Win32_Printer");
	ManagementObjectCollection fertigMOC = fertigMC.GetInstances();
	int lvi = 0;
	foreach ( ManagementObject fertigMO in fertigMOC)
	{
		ListViewItem item1 = new ListViewItem("    Drucker",0);
		try
		{item1.SubItems.Add(druckername[lvi].ToString());}
		catch {}
		ListViewItem item2 = new ListViewItem("      Modell",0);
		try
		{item2.SubItems.Add(fertigMO["DriverName"].ToString());}
		catch {}
		ListViewItem item3 = new ListViewItem("      Treiberversion",0);
		try
		{item3.SubItems.Add(treiberversion[lvi].ToString());}
		catch{}
		ListViewItem item4 = new ListViewItem("      Port",0);
		try
		{item4.SubItems.Add(fertigMO["PortName"].ToString());}
		catch {}
		hwlistview.Items.AddRange(new ListViewItem[]{item1, item2,item3, item4});
		lvi++;				
		UpdatehwProgressBar(false);
	}
	#endregion
}
#endregion


So ich hoffe das wird einigen weiterhelfen, die das selbe Prob haben.

MfG
Alex
 

Neue Beiträge