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:


eN.