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.
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.
Tomek