Sprawa dość trywialna… przynajmniej tak by się można spodziewać. Limity wielkości skrzynek zapisane są w dwóch miejscach:

  • w parametrach samej skrzynki na Exchange – to dla tych, którzy będą mieli ‘use mailbox default’
  • w atrybutach w AD, które będą za chwilę opisane.

zacznę najpierw od szmacianego raportu SCCM:

nie wiem czy panowie z centrali sami przygotowywali ten raport czy to standardowy [domel, wiesz może?] ale jest to jeden z najbardziej oszukańczych raportów jaki widziałem:

  • dla osób z flagą ‘use default’ pokazuje wszędzie wartości null – jak by nikt nie miał skrzynki
  • dla osób, które mają zarówno ‘use default’ ale kiedykolwiek miały inne wartości, wartości te zachowane są w atrybutach AD [tyle, że nieużywane]. w zwiazq z tym SCCM pokazuje nieprawdziwe wartości, które są nieużywane.
  • jedyne co pokazuje dobrze to osoby, które mają coś ręcznie ustawione i jest to w użyciu.

masakra. trzeba było olać raport i zrobić to dobrze – czyli ręcznie. sprawa jest prosta. wykorzystywane są cztery atrybuty obiektu user [zapisuję małymi znakami, ponieważ przypominam, że PS wymaga używania w lowercase!]:

  • mdbusedefaults – czyli flaga ‘use defaults’. jeśli ustawiona jest na ‘true’ to reszta nie jest sprawdzana. po prostu dziedziczy parametry ustawione na storze [dla GT –> “na magazynie” (; ]
  • mdbstoragequota – wartość ‘issue warning’. quota
  • mdboverquotalimit – wartość ‘prohibit send’. softquota.
  • mdboverhardquotalimit – wartość ‘prohibit to send and receive’. hardquota.

image

so far, so good. problem zaczyna się kiedy próbuje się sprawdzić która skrzynka ma wartość domyślną, a która nie. powód – podstawowy dla PS czyli ‘co za cholerstwo zwraca ta funkcja?’. aby podjąć działanie zależnie od wartości mdbusedefaults trzeba sprawdzić czy ma wartość true czy false. a oto wyniki zabawy:

PS C:> $r.properties.mdbusedefaults
False
PS C:> if ($r.properties.mdbusedefaults -eq $false) {echo „aaaa”}
PS C:> if ($r.properties.mdbusedefaults -eq $true) {echo „aaaa”}
PS C:> if ($r.properties.mdbusedefaults -eq $null) {echo „aaaa”}
PS C:> if ($r.properties.mdbusedefaults) {echo „aaaa”}
aaaa
PS C:> if ($r.properties.mdbusedefaults -eq 'False’) {echo „aaaa”}

co widać? w pierwszym zapytaniu dostajemy wartość false. kiedy jednak próbuje się tą wartość porównać z $false czy $true – żadna z powyższych. nie jest to również $null. w takim razie oczywistym wydaje się, że to musi być po prostu string. ale i to zawodzi.

pomimo usilnych prób nic z tego nie wyszło. poszedłem spać a na drugi dzień rozwiązanie jakoś tak samo przyszło:

PS C:> $r.properties.mdbusedefaults.gettype()

IsPublic IsSerial Name                                     BaseType
——– ——– —-                                     ——–
True     False    ResultPropertyValueCollection            System.Collections.ReadOnlyCollectionBase

skoro jest kolekcją to trzeba to zrobić tak:

PS C:> $r.properties.mdbusedefaults[0]
False
PS C:> if ($r.properties.mdbusedefaults[0] -eq $false) {echo „aaaa”}
aaaa

pytanie ‘czemu, u licha, to jest kolekcją??!!’ pozostawiam otwarte. dla mnie to idiotyzm ale może ktoś zna jakieś logiczne wyjaśnienie?

a na zakończenie cały skrypt:

$searcher = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$searcher.filter = "(&(objectClass=user)(objectCategory=Person))"
$searcher.SearchRoot="LDAP://OU=myou,DC=domain,DC=lab"
$searcher.searchscope="Subtree"
$searcher.PropertiesToLoad.add("mdbusedefaults")|out-null
$searcher.PropertiesToLoad.add("samaccountname")|out-null
$searcher.PropertiesToLoad.add("adspath")|out-null
$searcher.PropertiesToLoad.add("mdboverhardquotalimit")|out-null
$searcher.PropertiesToLoad.add("mdboverquotalimit")|out-null
$searcher.PropertiesToLoad.add("mdbstoragequota")|out-null
$results=$searcher.findall()

foreach($r in $results) {
   $prop=$r.properties
   if ($prop.mdbusedefaults) {
     if ( $prop.mdbusedefaults[0] -eq $true ) {
          echo "$($prop.samaccountname) has default"
  #if u want it clear out for SCCM reports
  #         $aduser=[ADSI]"$($prop.adspath)"
  #         $aduser.putex(1,"mdboverhardquotalimit","")
  #         $aduser.putex(1,"mdboverquotalimit","")
  #         $aduser.putex(1,"mdbstoragequota","")
  #        $aduser.SetInfo()
     } else {
          echo "$($prop.samaccountname) limits: $($prop.mdboverhardquotalimit) $($prop.mdboverquotalimit) $($prop.mdbstoragequota)"
     }
   } else {
      echo "$($prop.samaccountname) has no mailbox"
   }

}
echo "done."

eN.

-o((:: sprEad the l0ve ::))o-

Comments (1)

  1. Odpowiedz

    Dodaj sobie PageSize do tego DirectorySearcher :). I nie łatwiej by było założyc filtr taki żeby nie zwracało Ci ludzików bez skrzynek – w końcu i tak cie nie interesuja.

    Swoją drogą cały ten skrypt się da zastąpić jedną linijką z adfind.exe albo nawet i csvde, które potem można wciągnąć do Excela czy czegoś. Jak rozumiem jedyne co on daje to że w przypadku gdy użyte sa defaulty, nie wyświetla tego co jest w atrybutach. Ale to znowu szybkie czyszczenie danych w Excel czy innym preprocesorze.

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.