Centrum skryptów - Systemy operacyjne

Jak utworzyć przydział dysku udostępniający użytkownikowi nieograniczone miejsce na dysku?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak utworzyć przydział dysku udostępniający użytkownikowi nieograniczone miejsce na dysku?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Wasz artykuł Managing Disk Quotas in Windows Server 2003 and Windows XP (j.ang) jest całkiem do rzeczy, jednak nie uwzględnia jednego ważnego szczegółu: jak określić nieograniczony przydział dysku dla użytkownika?

-- CA

Cześć Skrypciarze! Pytanie

Cześć, CA. Nie macie czasem dość polityki? No, może nie tyle samej polityki, co polityków w nią zaangażowanych. Nie mam wcale zamiaru poruszać tu żadnych drażliwych kwestii, nie chciałbym nikogo przez to urazić, ale chcę dać upust swojemu niezadowoleniu z obecnej sytuacji. Jestem pewien, że moje uczucia podziela wiele osób niezależnie od sowich preferencji politycznych, gdyż istniejącą sytuacja staje się nie do zniesienia dla wszystkich. Postanowiłem sobie dzisiaj, że nie będę się w nic mieszał, nie będę oglądał wiadomości ani czytał artykułów na temat sytuacji politycznej. Moje postanowienie odbije się wielkim echem na starcie w Zimowej Olimpiadzie Skrypciarskiej 2008, zaczynającej się 15. lutego, gdyż dzięki niemu będę miał więcej czasu, żeby się do niej lepiej przygotować. Jeżeli tylko ktoś z Was ma podobne odczucia, zachęcam do takiego samego postanowienia. Z pewnością jest to wyjście z sytuacji o wiele mniej stresujące niż śledzenie tego, co się aktualnie dzieje. No chyba, że ktoś ma stalowe nerwy i postrzega wszystko jak jakiś zły sen, który szybko minie.

A wracając do dzisiejszego pytania o skrypt udostępniający użytkownikowi nieograniczony przydział dysku, przedstawiam efekt mojej dzisiejszej pracy:

Const No_Limit = "18446744073709551615"



strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set objAccount = objWMIService.Get _

    ("Win32_Account.Domain='fabrikam',Name='kenmyer'")

Set objDisk = objWMIService.Get _

    ("Win32_LogicalDisk.DeviceID='D:'")

Set objQuota = objWMIService.Get _

    ("Win32_DiskQuota").SpawnInstance_



objQuota.QuotaVolume = objDisk.Path_.RelPath

objQuota.User = objAccount.Path_.RelPath

objQuota.Limit = No_Limit

objQuota.WarningLimit = No_Limit 

objQuota.Put_

Uwaga. Wiem, że może wygląda on trochę dziwnie, ale nie należy się tym w ogóle przejmować. Mogło być jeszcze gorzej. Dla przykładu spójrzcie na poniższy wiersz kodu ze skryptu usuwającego wpis przydziału dysku:

Set objQuota = objWMIService.Get _

    ("Win32_DiskQuota.QuotaVolume='Win32_LogicalDisk.DeviceID=" & chr(34) & strDrive & chr(34) & "'," & _

        "User='Win32_Account.Domain=" & chr(34) & strDomain & chr(34) & _

            ",Name=" & chr(34) & strUser & chr(34) & "'")

Naprawdę, jest się z czego cieszyć!

Jak widać, zaczynamy od zdefiniowania stałej o nazwie No_Limit i nadajemy jej wartość 18446744073709551615; chyba nie muszę dodawać, że jeżeli ustawimy właściwości Limit oraz WarningLimitprzydziału dysku na 18446744073709551615, to końcowym efektem będzie ich skonfigurowanie jako No limit.

Uwaga. Prawdę mówiąc nie mam pojęcia, skąd wzięła się wartość 18446744073709551615 (nawet nie potrafię jej poprawnie odczytać).

Po definiowaniu stałej No_Limit łączymy się z usługą WMI na lokalnym komputerze. Czy możemy uruchomić ten skrypt na zdalnym komputerze? Oczywiście, że tak; wystarczy przypisać nazwę tego zdalnego komputera do zmiennej o nazwie strComputer. Na przykład:

strComputer = "atl-fs-001"

Następnie musimy utworzyć trzy obiekty:

Set objAccount = objWMIService.Get _

    ("Win32_Account.Domain='fabrikam',Name='kenmyer'")

Set objDisk = objWMIService.Get _

    ("Win32_LogicalDisk.DeviceID='D:'")

Set objQuota = objWMIService.Get _

    ("Win32_DiskQuota").SpawnInstance_

Za pomocą wiersza 1 tworzymy odwołanie do obiektu do użytkownika, któremu chcemy przydzielić nowy przydział dysku. Do tego potrzebna jest nam metoda Get usługi WMI, która pobierze wystąpienie klasy Win32_Account, w którym właściwość Domain ma wartość fabrikam, a właściwość Name (nazwa logowania) ma wartość kenmyer.

W drugim wierszu tworzymy odwołanie do obiektu do klasy Win32_LogicalDisk. Określamy po prostu właściwość DeviceID dysku, w którym utworzony zostanie przydział dysku. Ponieważ chcemy utworzyć przydział na dysku D, przypisujemy właściwości DeviceID wartość D:(uwaga na dwukropek na końcu).

Na koniec tworzymy odwołanie do obiektu do klasy Win32_DiskQuota, a następnie stosujemy metodę SpawnInstance_ w celu wygenerowania nowego, pustego przydziału dysku. W tym momencie jesteśmy gotowi, żeby przypisać pewne wartości do właściwości nowego przydziału dysku.

W tym celu najpierw wykonujemy poniższe dwa wiersze kodu, aby określić wielkość przydziału i konto użytkownika:

objQuota.QuotaVolume = objDisk.Path_.RelPath

objQuota.User = objAccount.Path_.RelPath

Jak widać, w każdym przypadku używamy właściwości Path_.RelPath naszego odwołania do obiektu podczas przypisywania wartości właściwości. Dlaczego? Gdybyśmy nie zastosowali właściwości RelPath (ścieżka względna), musielibyśmy przekazać do właściwości Usernastępującą wartość:

Win32_UserAccount.Domain="fabrikam",Name="kenmyer"

Oczywiście, cały ten ciąg – cudzysłowy i inne takie – musi zostać ujęty w kolejnym cudzysłowie. Jeżeli mieliście już do czynienia ze skryptami VBScript, wiecie ile frajdy może dostarczyć umieszczanie cudzysłowu wewnątrz innego cudzysłowu. Na szczęście wartość właściwości Path_.RelPath przedstawia się następująco:

Win32_UserAccount.Domain="fabrikam",Name="kenmyer"

Czyż to nie wygląda znajomo? Dlatego właśnie zastosowaliśmy właściwość RelPath.

Po zajęciu się właściwościami QuotaVolume oraz User wykonujemy poniższe dwa wiersze kodu (oraz stałą No_Limit) w celu nadania zarówno właściwości Limit, jak i WarningLimit wartości „no limit”:

objQuota.Limit = No_Limit

objQuota.WarningLimit = No_Limit

Kiedy przypiszemy wartości właściwości, wywołujemy metodę Put_ w celu przypisania nowego przydziału dysku do dysku D:

objQuota.Put_

Czy to naprawdę zadziała? Cóż, sami zobaczcie:

I co Wy na to?

To chyba załatwia całą sprawę.

  Do początku strony  Do początku strony

Centrum skryptów - Systemy operacyjne