{"id":1250,"date":"2015-11-26T20:31:14","date_gmt":"2015-11-26T18:31:14","guid":{"rendered":"http:\/\/blog.langlitz-it.de\/?p=1250"},"modified":"2017-08-10T12:55:04","modified_gmt":"2017-08-10T10:55:04","slug":"powershell-attribute-verschiedener-objekte-vergleichen-beispiel","status":"publish","type":"post","link":"https:\/\/www.langlitz-it.de\/?p=1250","title":{"rendered":"PowerShell &#8211; Attribute verschiedener Objekte vergleichen"},"content":{"rendered":"<p>Wenn Sie <em>Attribute<\/em> von Objekten verschiedener <em>CmdLets<\/em> miteinander vergleichen m\u00f6chten, ist dies hier ein m\u00f6glicher L\u00f6sungsansatz.<br \/>\nEs werden der <em>SAMAccountName<\/em> eines <em>Users<\/em> und das <em>LastLoggedOnUserAccount<\/em> einer <em>Exchange<\/em> <em>Mailbox<\/em> miteinander verglichen.<\/p>\n<p>Um zu pr\u00fcfen, wer an einer <em>Mailbox<\/em> zuletzt angemeldet war, dient das <em>Attribut LastLoggedOnUserAccount.<\/em>\u00a0Dies kann \u00fcber <em>Get-MailboxStatistic<\/em> ausgelesen werden, sofern\u00a0die <em>Mailbox<\/em> bereits existiert.<br \/>\nWenn eine <em>Mailbox<\/em> angelegt wird, ist das zun\u00e4chst nur ein <em>Link<\/em> im <em>AD Objekt<\/em> des <em>Users<\/em>. Erst wenn der <em>User<\/em> sich das erste Mal an der <em>Mailbox<\/em> anmeldet oder wenn eine <em>Mail<\/em><br \/>\nvon der jeweiligen Adresse empfangen wird, wird die <em>Mailbox<\/em> physikalisch im <em>Exchange Store<\/em> angelegt.<br \/>\nIst die <em>Mailbox<\/em> noch nicht angelegt, liefert <em>Get-MailboxStatistics<\/em> einen Fehler zur\u00fcck. Wenn die <em>Mailbox<\/em> angelegt ist, weil schon eine Mail empfangen wurde,<br \/>\naber noch kein <em>User<\/em> angemeldet war, liefert <em>Get-MailboxStatistics<\/em> zwar Informationen zur\u00fcck. Allerdings ist das <em>LastLoggedOnUserAccount<\/em> dann leer und kann damit nicht weiterverarbeitet werden.<\/p>\n<p>Zun\u00e4chst lesen wir alle <em>Mailboxen<\/em> in eine <em>Variable<\/em> ein.<\/p>\n<p><em>$MB_all = get-mailbox resultsize unlimited<\/em><\/p>\n<p>Da <em>Get-Mailbox<\/em> nicht das <em>LastLoggedOnUserAccount<\/em> zur\u00fcck liefert, wir das aber mit dem <em>SAMAccountName<\/em> vergleichen wollen, m\u00fcssen wir das <em>Attribut<\/em> in einem <em>Array<\/em> speichern.<br \/>\nIn dieses <em>Array<\/em> wird dann \u00fcber <em>Get-MailboxStatistics<\/em> das <em>LastLoggedOnUserAccount<\/em> zus\u00e4tzlich abgelegt.<\/p>\n<p>Dazu wird ein leeres Array definiert.<\/p>\n<p><em>$m=@()<\/em><\/p>\n<p>Danach wird sowohl <em>SAMAccountName<\/em> als auch <em>LastLoggedOnUserAccount<\/em> darin abgelegt. Das erreichen wir mit einer <em>ForEach<\/em> Schleife.<\/p>\n<p><em>$MB_all | % { $t=1| select mb,mbs; $t.mb = $_ ;$t.mbs = Get-MailboxStatistics $_; $m+=$t}<\/em><\/p>\n<p>In der Schleife wird ein leeres <em>Objekt\u00a0<\/em>mit den beiden Spalten <em>mb<\/em> (f\u00fcr das Mailbox Objekt) und <em>mbs<\/em> (f\u00fcr das MailboxStatistics Objekt) erstellt.<br \/>\nDarin wird das jeweilige <em>Mailbox<\/em> Objekt \u00fcber <em>$_<\/em> in <em>$t.mb<\/em> abgelegt und dann das <em>MailboxStatistics<\/em> Objekt abgefragt und in <em>$t.mbs<\/em> gespeichert.<br \/>\nIm letzten Schritt der Schleife werden dann beide Objekt in <em>$m<\/em> \u00fcbertragen, bevor im n\u00e4chsten Durchlauf <em>$t<\/em> wieder gel\u00f6scht wird.<br \/>\nDamit ist sichergestellt, dass ein <em>Mailbox<\/em> Objekt auch ein zugeh\u00f6riges <em>MailboxStatistics<\/em> Objekt hat, selbst wenn dieses leer ist.<\/p>\n<p>Nun kann die abgefragte Information weiterverarbeitet werden.<\/p>\n<p>Wenn Sie beispielsweise wissen m\u00f6chten, wie viele <em>User\u00a0<\/em>selbst an ihrer <em>Mailbox<\/em> angemeldet waren, erreichen Sie das mit dieser Abfrage:<\/p>\n<p><em>(0..($m.mb.count-1) | ? {$m.mb.samaccountname[$_] -match $m.mbs.lastloggedonuseraccount[$_].trimstart(&#8220;IhrDomainName\\&#8221;)}).count<\/em><\/p>\n<p>Hierbei l\u00e4uft eine Schleife von 0 bis zur Anzahl aller <em>Mailboxen,<\/em> in der gepr\u00fcft wird, ob der jeweilige <em>SAMAccountName<\/em> gleich dem <em>LastLoggedOnUserAccount<\/em> ist. Der <em>Dom\u00e4nenname<\/em>, der in <em>LastLoggedOnUserAccount<\/em> enthalten ist, muss dazu noch den &#8220;\\&#8221; entfernt bekommen, da die <em>Powershell<\/em> diesen als <em>Escape<\/em> Zeichen interpretiert.<br \/>\nDas kann unter anderem mit <em>TrimStart<\/em> wie im Beispiel erreicht werden.<\/p>\n<p>Wenn Sie umgekehrt wissen m\u00f6chten, welche\u00a0<em>User<\/em> in den letzten 10 Tagen nicht in ihrem <em>LastLoggedOnUserAccount<\/em> stehen, geht das mit einer kleinen Erweiterung:<\/p>\n<p><em>0..($m.mb.count-1) | ? {$m.mb.samaccountname[$_] -notmatch $m.mbs.lastloggedonuseraccount[$_].trimstart(&#8220;Domain\\&#8221;) -and $m.mbs.lastlogontime[$_] -gt(get-date).adddays(-10)}\u00a0|% {$m[$_].mb.samaccountname}<\/em><\/p>\n<p>Der Vergleich liefert den Index des Arrays. Dieser Index wird in eine weitere <em>ForEach<\/em> Schleife \u00fcbergeben und so der jeweilige <em>SAMAccountName<\/em> ausgegeben.<\/p>\n<p>Sie k\u00f6nnten genauso aus dem <em>Array $m<\/em> z.B. nur alle <em>Mailboxen<\/em> mit einer bestimmten <em>SMTP Domain<\/em> oder \u00e4hnliches heraus filtern und nur diese abfragen.<\/p>\n<p>Mit dieser Vorgehensweise lassen sich auch beliebige andere Informationen, die von verschiedenen CmdLets zur\u00fcck geliefert werden, vergleichen oder weiterverarbeiten.<\/p>\n<p>Viel Spass damit!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Attribute von Objekten verschiedener CmdLets miteinander vergleichen m\u00f6chten, ist dies hier ein m\u00f6glicher L\u00f6sungsansatz. Es werden der SAMAccountName eines Users und das LastLoggedOnUserAccount einer Exchange Mailbox miteinander verglichen. Um zu pr\u00fcfen, wer an einer Mailbox zuletzt angemeldet war, &hellip; <a href=\"https:\/\/www.langlitz-it.de\/?p=1250\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[551,541,250,30,173,252,553,540],"_links":{"self":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1250"}],"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=1250"}],"version-history":[{"count":9,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1250\/revisions"}],"predecessor-version":[{"id":2013,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1250\/revisions\/2013"}],"wp:attachment":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}