{"id":1605,"date":"2017-07-15T14:17:29","date_gmt":"2017-07-15T12:17:29","guid":{"rendered":"http:\/\/blog.langlitz-it.de\/?p=1605"},"modified":"2017-08-10T12:51:53","modified_gmt":"2017-08-10T10:51:53","slug":"powershell-steuerung-von-applikationen-uber-comobjekte","status":"publish","type":"post","link":"https:\/\/www.langlitz-it.de\/?p=1605","title":{"rendered":"PowerShell \u2013 Steuerung von Applikationen \u00fcber ComObjekte"},"content":{"rendered":"<p>Sie k\u00f6nnen Applikationen, dies das entsprechend unterst\u00fctzen, mit der <em>PowerShell<\/em> \u00fcber <em>ComObjekte<\/em> steuern. Ich stelle dies hier an Beispielen f\u00fcr <em>Excel<\/em> und <em>Outlook<\/em> dar. Diese Vorgehensweise l\u00e4sst sich aber auch f\u00fcr andere Applikation \u00e4hnlich nutzen.<\/p>\n<hr \/>\n<h2>Excel<\/h2>\n<p>Ich erstelle eine neue Excel Datei mit einer Liste von St\u00e4dten, deren Bundesland sowie deren Einwohnerzahl.<\/p>\n<p>Zun\u00e4chst muss ein <em>ComObjekt<\/em> f\u00fcr <em>Excel<\/em> erstellt werden. Voraussetzung ist nat\u00fcrlich, dass <em>Excel<\/em> auch auf der Maschine, auf der ich arbeite, installiert ist.<\/p>\n<p><em>$Excel = New-Object -ComObject Excel.Application<\/em><\/p>\n<p>Die Methoden und Eigenschaften dieses Objektes k\u00f6nnen Sie sich \u00fcber die <em>Get-Member<\/em> Funktion ansehen.<\/p>\n<p><em>$Excel |gm<\/em><\/p>\n<p>\u00dcber das <em>Property<\/em> <em>Visible<\/em> k\u00f6nnen Sie z.B. <em>Excel<\/em> sichtbar machen, bzw. verstecken.<\/p>\n<p><em>$Excel.Visible = $True<\/em><\/p>\n<p><em>$Excel.Visible = $False<\/em><\/p>\n<h3>Neue Arbeitsmappe<\/h3>\n<p>Als n\u00e4chstes wird eine neue Arbeitsmappe mit einer Tabelle erstellt.<\/p>\n<p><em>$Workbook = $Excel.Workbooks.Add()<\/em><\/p>\n<p>Zur leichteren Adressierung, lese ich die Tabelle in eine Variable ein.<\/p>\n<p><em>$Worksheet =$Workbook.Worksheets.Item(1)<\/em><\/p>\n<p>Wieder \u00fcber die <em>Get-Member<\/em> Funktion k\u00f6nnen Sie auch hier alle Methoden und Eigenschaften einer Tabelle sehen.<\/p>\n<p><em>$Worksheet |gm<\/em><\/p>\n<p>Nun wird die Tabelle mit Daten gef\u00fcllt. Sie k\u00f6nnen dazu jede einzelne Zelle direkt adressieren und beschreiben.<\/p>\n<p><em>$worksheet.Cells.Item(1,1).value2=&#8221;Stadt&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(1,2).value2=&#8221;Bundesland&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(1,3).value2=&#8221;Einwohnerzahl&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(2,1).value2=&#8221;Frankfurt&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(2,2).value2=&#8221;Hessen&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(2,3).value2=&#8221;700000&#8243;<\/em><br \/>\n<em>$worksheet.Cells.Item(3,1).value2=&#8221;Dresden&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(3,2).value2=&#8221;Sachsen&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(3,3).value2=&#8221;550000&#8243;<\/em><br \/>\n<em>$worksheet.Cells.Item(4,1).value2=&#8221;Hannover&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(4,2).value2=&#8221;Niedersachsen&#8221;<\/em><br \/>\n<em>$worksheet.Cells.Item(4,3).value2=&#8221;520000&#8243;<\/em><\/p>\n<p>Wenn die Eingabe beendet ist, nat\u00fcrlich noch abspeichern.<\/p>\n<p><em>$FilePath = \u201eD:\\Town.xlsx\u201c<\/em><\/p>\n<p><em>$workbook.SaveAs($filepath)<\/em><\/p>\n<p>So sieht die Datei nun aus, wenn wir sie mit Excel \u00f6ffnen.<\/p>\n<p><a href=\"http:\/\/blog.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1606\" src=\"http:\/\/blog.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL1.jpg\" alt=\"excelol1\" width=\"797\" height=\"383\" srcset=\"https:\/\/www.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL1.jpg 797w, https:\/\/www.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL1-300x144.jpg 300w, https:\/\/www.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL1-768x369.jpg 768w\" sizes=\"(max-width: 797px) 100vw, 797px\" \/><\/a><\/p>\n<p>Ein farbliches Hinterlegen der Zellen (sowie auch alle anderen Formatierungsoptionen) ist nat\u00fcrlich auch m\u00f6glich.<\/p>\n<p><em>$worksheet.Range(&#8220;A1:C1&#8221;).Interior.colorindex = 6<\/em><\/p>\n<p>Und wieder speichern.<\/p>\n<p><em>$workbook.Save()<\/em><\/p>\n<p>Nun mit gelber Kopfzeile<\/p>\n<p><a href=\"http:\/\/blog.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1607\" src=\"http:\/\/blog.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL2.jpg\" alt=\"excelol2\" width=\"658\" height=\"389\" srcset=\"https:\/\/www.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL2.jpg 658w, https:\/\/www.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL2-300x177.jpg 300w\" sizes=\"(max-width: 658px) 100vw, 658px\" \/><\/a><\/p>\n<p>So l\u00e4sst sich nat\u00fcrlich auch alles andere in der Tabelle \u00e4ndern. Im Prinzip ist damit die komplette Steuerung ohne GUI m\u00f6glich.<\/p>\n<hr \/>\n<h2>Outlook<\/h2>\n<p>Bei Outlook ist das alles ebenso m\u00f6glich. Es gibt aber einige wenige Besonderheiten. Sie m\u00fcssen ein <em>Standardprofil<\/em> ausw\u00e4hlen und k\u00f6nnen dann \u00fcber <em>MAPI<\/em> auch nur auf die eingerichtete <em>Mailbox<\/em> zugreifen. Wenn Sie weitere <em>Mailboxen<\/em> oder <em>PST<\/em> Dateien in dem <em>Profil<\/em> eingebunden haben, k\u00f6nnen Sie auf diese auch zugreifen.<\/p>\n<p>Auch hier muss zun\u00e4chst das entsprechende <em>ComObject<\/em> erstellt werden.<\/p>\n<p><em>$Outlook = New-Object -ComObject Outlook.Application<\/em><\/p>\n<p>Den <em>Namespace<\/em> des <em>Outlook Profils<\/em> legen wir zur weiteren Verwendung separat ab<\/p>\n<p><em>$Namespace = $Outlook.GetNamespace(&#8220;MAPI&#8221;)<\/em><\/p>\n<p>In der definierten <em>Session<\/em> suche ich nun den gew\u00fcnschten Ordner oder die gew\u00fcnschte <em>Mailbox<\/em>.<\/p>\n<p><em>$Mailbox = $Namespace.Session.Folders |? {$_.name -match &#8220;info@langlitz-it.de&#8221;}<\/em><\/p>\n<p>Nun suche ich mir z.B. die letzte gesendete Mail aus dem Ordner \u201e<em>Sent Items<\/em>\u201c<\/p>\n<p><em>$Mailbox.Folders |? {$_.name -match &#8220;sent items&#8221;} |% {$_.items} |select ReceivedTime,Subject,Body -Last 1 |fl<\/em><\/p>\n<p>ReceivedTime : 05.10.2016 12:24:00<br \/>\nSubject \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 : Das ist eine Testmail<br \/>\nBody \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 : Hallo,<br \/>\nHier steht der Text.<br \/>\nGru\u00df<\/p>\n<h3>Neue Mail<\/h3>\n<p>Um eine neue Mail zu erstellen, verwenden wir wieder das <em>ComObject<\/em>.<\/p>\n<p><em>$Outlook = New-Object -ComObject Outlook.Application<\/em><\/p>\n<p>Und nun das neue <em>Mail Object<\/em>.<\/p>\n<p><em>$Mail = $Outlook.CreateItem(0)<\/em><\/p>\n<p>Das Object <em>$Mail<\/em> m\u00fcssen wir noch mit Leben f\u00fcllen.<\/p>\n<p><em>$Mail.Recipients.Add(&#8220;Blog@Langlitz-IT.de&#8221;) <\/em><br \/>\n<em>$Mail.Subject = &#8220;Das ist eine Testmail&#8221;<\/em><br \/>\n<em>$Mail.HTMLBody = &#8220;&amp;lt;&amp;gt;Mail als HMTL&amp;lt;&amp;gt;&#8221;<\/em><\/p>\n<p>Nun k\u00f6nnen Sie sich die Mail nochmal anzeigen lassen.<\/p>\n<p><em>$Mail.Display()<\/em><\/p>\n<p><a href=\"http:\/\/blog.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL4.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1624\" src=\"http:\/\/blog.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL4.jpg\" alt=\"excelol4\" width=\"486\" height=\"412\" srcset=\"https:\/\/www.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL4.jpg 486w, https:\/\/www.langlitz-it.de\/wp-content\/uploads\/2016\/10\/ExcelOL4-300x254.jpg 300w\" sizes=\"(max-width: 486px) 100vw, 486px\" \/><\/a><\/p>\n<p>Alles OK? Dann wird die Mail versendet.<\/p>\n<p><em>$Mail.Send()<\/em><\/p>\n<p>\u00dcber die angebotenen Methoden k\u00f6nnen Sie Ihr Outlook steuern. Sie k\u00f6nnen Termine, Erinnerungen, Kontakte, etc. bis hin zu Regeln und Abwesenheitsnachrichten dar\u00fcber konfigurieren.<\/p>\n<h2>ComObject<\/h2>\n<p>Eine komplette Liste aller registrierten ComObjects k\u00f6nnen Sie \u00fcber die Registry auslesen.<\/p>\n<p><em>$ComObj = Get-ChildItem registry::HKEY_CLASSES_ROOT\\ -Include PROGID -Recurse |% {$_.GetValue(&#8220;&#8221;)}<\/em><\/p>\n<p><em>$ComObj | ? {$_ -match &#8220;outlook&#8221;}<\/em><\/p>\n<p>Oder<\/p>\n<p><em>$ComObj | ? {$_ -match &#8220;Application_Name&#8221;}<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sie k\u00f6nnen Applikationen, dies das entsprechend unterst\u00fctzen, mit der PowerShell \u00fcber ComObjekte steuern. Ich stelle dies hier an Beispielen f\u00fcr Excel und Outlook dar. Diese Vorgehensweise l\u00e4sst sich aber auch f\u00fcr andere Applikation \u00e4hnlich nutzen. Excel Ich erstelle eine neue &hellip; <a href=\"https:\/\/www.langlitz-it.de\/?p=1605\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[642,641,643,18,644,553,647,645,646],"_links":{"self":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1605"}],"collection":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1605"}],"version-history":[{"count":14,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1605\/revisions"}],"predecessor-version":[{"id":2006,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1605\/revisions\/2006"}],"wp:attachment":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}