Patrícia Meneses Vasques
1 BOLETIM TÉCNICO NComputing Brasil - # Gerenciando cotas de disco no Windows Server 2003 e no Windows XP Uma visão geral dos novos recursos encontrados no Windows Server 2003 e no Windows XP, que permitem a gravação dos scripts responsáveis pelo gerenciamento enciamento e pela configuração das cotas de disco em toda a empresa. Um breve histórico sobre as cotas de disco Sempre que você ouve um ditado popular, reconhece facilmente a mensagem de suas palavras. Quem não escuta cuidado, escuta coitado? Faz sentido. Quem tudo quer nada tem? Espere um pouco enquanto consultamos o orçamento da Equipe de Scripts Certo, não podemos contestar isso. Deus ajuda a quem cedo madruga? Bem, neste teremos que ter fé. Mas ainda assim ele é bastante razoável. Observe este: Cuidado do com o que deseja, pois pode conseguir. O quê? Esse não faz o menor sentido. Por que você desejaria algo que não o deixasse feliz? Ah, certo: parece que até mesmo os autores de ditados populares têm um dia de folga. (O que levaria um longo tempo para explicar o ditado Não se pode ter tudo o que deseja.) Entretanto, os administradores do sistema que já atuavam no mercado antes do lançamento do Windows 2000 compreendem bem o significado do ditado popular Cuidado com o que deseja. Na época do Windows NT, um dos principais itens da lista de desejos de qualquer administrador do sistema eram as cotas de disco, às quais o Windows NT não oferecia suporte. E advinha o que aconteceu no lançamento do Windows 2000? Exatamente, a Microsoft considerou o seu desejo uma ordem: o Windows 2000 oferecia suporte completo às cotas de disco (em volumes NTFS) prontas. De acordo com outro ditado Peça e receberás. Então, qual era o problema? É importante ressaltar que não havia nada de errado com as cotas de disco, elas funcionavam exatamente conforme o previsto. O problema era dos administradores do sistema, que possuíam uma excelente ferramenta à sua disposição, mas não sabiam a melhor maneira de gerenciá-la. As cotas de disco tinham de ser gerenciadas de unidade para unidade, uma forma complexa de chegar ao uso geral das cotas em um computador (ou seja, a utilização das cotas distribuída por todas as unidades de um computador). Não apenas isso, mas: Não era possível gerar relatórios de cotas de disco.
2 Para gerenciar essas cotas em computadores remotos, embora fosse possível, era necessário utilizar métodos um pouco obscuros. As opções de script eram igualmente limitadas, funcionando apenas em uma única unidade do computador local. (Se estiver interessado em usar scripts para gerenciar cotas de disco no Windows 2000, consulte a seção Gerenciando cotas de disco no Guia de Scripts do Microsoft Windows 2000.) Em outras palavras, os administradores do sistema conseguiram exatamente o que desejavam: cotas de disco. O problema é que esqueceram de desejar ferramentas de gerenciamento para elas também. As cotas de disco eram, e ainda são, muito úteis no Windows 2000, mas a ausência de ferramentas de gerenciamento dificulta a sua administração em toda a empresa. Você sabe o que eles dizem? As coisas boas acontecem para aqueles que sabem esperar. Isso parece se aplicar ao caso das cotas de disco. Os administradores do sistema conseguiram as cotas de disco com o Windows 2000, mas não tiveram ajuda para gerenciá-las em toda a empresa. Com o Windows Server 2003 (e o Windows XP) isso mudou. Agora você pode gerenciar cotas de disco facilmente em toda a empresa. Isso se deve às novas classes WMI, presentes no Windows Server 2003 e no Windows XP, criadas para gerenciar as cotas de disco e suas configurações. Este artigo detalhará essas duas classes WMI e oferecerá diversos scripts de exemplo, que mostrarão como usá-las, para realizar todos os tipos de tarefas de gerenciamento. Contudo, é necessário fazer uma pequena pausa para falar sobre a tecnologia responsável pelas cotas de discos. Como as cotas de disco funcionam As cotas de disco são uma parte integral do sistema de arquivos NTFS. Sempre que um arquivo (ou pasta) é criado em um volume NTFS, ele é atribuído a um proprietário (normalmente o usuário que o criou). Antes que o arquivo seja salvo, o NTFS obtém a ID de usuário de seu proprietário e armazena as informações no atributo Informações Padrão do arquivo (usado para controlar a alocação de espaço em disco). Em seguida, o NTFS localiza a entrada das cotas de disco para esse usuário e determina se a nova alocação do espaço em disco fará com que ele exceda a sua cota. Se isso ocorrer, o NTFS realizará as etapas apropriadas, que podem incluir o logon em uma entrada do log de eventos do sistema ou evitar que o usuário crie um arquivo ou pasta. À medida que o arquivo muda de tamanho, o NFTS atualiza a entrada da cota de disco para refletir o espaço total em disco utilizado pelo usuário. Tudo isso acontece nos bastidores e de forma tão rápida que você nem vai perceber. Antes de poder gerenciar as cotas de disco é importante entender que elas não estão configuradas em uma base computacional ampla. Ao contrário, as cotas de disco estão
3 ligadas a volumes NTFS individuais. Cada unidade possui configurações de cota separadas e as ações relacionadas a um volume não afetam os outros volumes. Por exemplo, um computador pode ter um único disco rígido dividido em três volumes: unidades C, D e E. Cada uma dessas unidades terá uma configuração de cotas individual. Você pode habilitar as cotas de disco nas unidades C e D e não habilitá-las las na unidade E. Da mesma forma, você pode conceder aos usuários 50 MB de espaço em disco na unidade C e 100 MB na unidade D. Em outras palavras, ao gerenciar cotas de disco, as ações realizadas em um volume não afetam de forma alguma os outros volumes. Se você alocar 50 MB de espaço em disco para um usuário na unidade C, isso não significa que ele terá o mesmo espaço nas unidades D e E. Se você desabilitar as cotas de disco da unidade de D, as cotas das unidades C e E permanecerão habilitadas. Lembre-se que as cotas de disco também são configuradas por usuário. Isso será abordado mais detalhadamente a seguir neste artigo. Além da alocação do espaço em disco, você também pode especificar um nível de aviso de cota, o volume de uso do espaço em disco que dispara um alerta (um evento gravado no log de eventos do sistema, informando que o usuário está próximo de atingir o limite da cota). Também é possível determinar a ação a ser realizada pelo sistema se o usuário exceder a cota: Nenhuma ação. Gravar um evento no log de eventos do sistema. Negar ao usuário o direito de armazenar dados adicionais até que alguns arquivos sejam removidos para restabelecer o limite da cota. O WMI possui duas classes ses usadas para gerenciar cotas de disco nas unidades NTFS. A classe Win32_QuotaSetting é usada para configurar as definições de cota de cada unidade. Isso inclui medidas como a habilitação ou não das cotas na unidade, a cota padrão e os limites de aviso aplicados aos novos usuários. Enquanto isso, a classe Win32_DiskQuota é destinada a gerenciar entradas de cota individuais: ela é usada para enumerar, criar, modificar e excluir entradas de cotas para usuários individuais. Com apenas essas duas classes é possível realizar qualquer tarefa de gerenciamento necessária. Configurações de gerenciamento de cotas de disco Se você não leu a seção educacional acima, vamos repetir: a classe Win32_QuotaSetting é usada para determinar as situações em que as cotas estejam habilitadas ou não (para toda e qualquer unidade de um computador), a cota padrão e os limites de aviso definidos para uma unidade e as ações administrativas, se houver, que serão realizadas caso um usuário exceda o seu limite de cota. A tabela abaixo mostra as propriedades da classe
4 Win32_QuotaSetting. Todas essas propriedades, exceto a VolumePath, são de leitura/gravação, ou seja, significa que você não está limitado a apenas reportar seus valores existentes. Em vez disso, você pode usar scripts para modificar o valor dessas propriedades. Propriedade DefaultLimit DefaultWarningLimit ExceededNotification State VolumePath Descrição Limite padrão (em KB) para cotas em um determinado volume. Limite de aviso padrão (em KB) para cotas em um determinado volume. Indica se os eventos serão gravados ou não no log de eventos, caso os usuários excedam suas cotas. (Verdadeiro/Falso) Nível de gerenciamento de cota para um determinado volume. Os valores são: 0: : o gerenciamento de cotas não está habilitado nesse volume. 1: as cotas são rastreadas, mas o valor limite não é aplicado e os usuários podem exceder seus limites. 2: : as cotas são rastreadas e aplicadas nesse volume. Nome do volume contendo as cotas de disco. Pode ser o nome ou o caminho do volume (como D:\\). Ao usar um caminho, é necessário acrescentar duas barras inversas (\\). WarningExceededNotification Indica se o eventos serão gravados ou não no log de eventos, quando o limite de aviso for excedido. (Verdadeiro/Falso) Essas propriedades também podem ser mapeadas para os elementos da interface do usuário, encontrados na caixa de diálogo Propriedades de uma unidade NTFS:
5 Para visualizar a versão em tela inteira desse gráfico, O que você realmente pode fazer com a classe Win32_QuotaSetting? A tarefa mais comum é estabelecer uma conexão com um computador e descobrir se as cotas de disco foram habilitadas nos volumes NTFS do computador (e, em caso afirmativo, determinar como as definições de cota foram configuradas). Para retornar as informações de definição de cota para um computador, basta estabelecer ligação com a classe Win32_QuotaSetting e exibir novamente os valores de cada propriedade: strcomputer = "." Set colquotasettings = objwmiservice.execquery _ ("Select * from Win32_QuotaSetting") For Each objquotasetting in colquotasettings Wscript.Echo "Default Limit: " & objquotasetting.defaultlimit Wscript.Echo "Default Warning Limit: " & _ objquotasetting.defaultwarninglimit Wscript.Echo "Exceeded Notification: " & _ objquotasetting.exceedednotification Wscript.Echo "State: " & objquotasetting.state Wscript.Echo "Volume Path: " & objquotasetting.volumepath Wscript.Echo "Warning Exceeded Notification: " & _ objquotasetting.warningexceedednotification Next O script anterior retorna informações de definição de cota para todos os volumes NTFS em um computador. E se você quisesse saber apenas as informações relacionadas às definições de cota para a unidade D? Nesse caso, adicione uma cláusula WHERE à sua consulta WQL, que limite os dados retornados à unidade D: strcomputer = "." Set colquotasettings = objwmiservice.execquery _
6 ("Select * from Win32_QuotaSetting Where VolumePath = 'D:\\'")'") For Each objquotasetting in colquotasettings Wscript.Echo "Default Limit: " & objquotasetting.defaultlimit Wscript.Echo "Default Warning Limit: " & _ objquotasetting.defaultwarninglimit Wscript.Echo "Exceeded Notification: " & _ objquotasetting.exceedednotification Wscript.Echo "State: " & objquotasetting.state Wscript.Echo "Volume Path: " & objquotasetting.volumepath Wscript.Echo "Warning Exceeded Notification: " & _ objquotasetting.warningexceedednotification Next Observe que é necessário incluir uma barra inversa extra ao especificar a unidade D (D:\\). Como a barra invertida (\) é um caractere re reservado no WMI, ela pode ser perdida (se for precedida por outra barra invertida) sempre que for exibida em uma cláusula WHERE. Habilitando e desabilitando as cotas de disco A classe Win32_QuotaSetting facilita a habilitação e a desabilitação das cotas de disco. A utilização dos scripts do WMI para realizar essas tarefas é especialmente útil, porque eles podem ser executados em computadores remotos como se fossem computadores locais. Os scripts também são uma excelente forma de gerenciar as cotas de disco, porque oferecem flexibilidade para habilitá-las las em um único volume ou para todos os volumes do computador. A escolha é sua. Você pode ativar e desativar as cotas de disco, manipulando o valor da propriedade State. Ela aceita três valore possíveis: 0: : as cotas de discos estão desativadas. 1: : as cotas de discos são rastreadas, mas não são aplicadas. Em outras palavras, o sistema operacional manterá o controle das informações da cota, mas os usuários poderão exceder seu limite. 2: : as cotas de discos são rastreadas e aplicadas. Nesse caso, os usuários não poderão exceder as cotas de disco, ou seja, caso um usuário queira salvar um arquivo que o fará exceder o limite da cota, uma mensagem informando que o espaço em disco é insuficiente será exibida.
7 O script a seguir configura um computador para rastrear e aplicar as cotas de disco em uma unidade C: Const ENFORCE_QUOTAS = 2 strcomputer = "." Set coldisks = objwmiservice.execquery _ ("Select * from Win32_QuotaSetting Where VolumePath = 'C:\\'")'") For Each objdisk in coldisks objdisk.state = ENFORCE_QUOTAS objdisk.put_ Next Primeiro o script define uma constante, ENFORCE_QUOTAS, e atribui a ela o valor 2. Então ele se conecta ao serviço WMI e recupera as definições de cota para a unidade C, usando esta linha de código: Set coldisks = objwmiservice.execquery _ ("Select * from Win32_QuotaSetting Where VolumePath = 'C:\\'")'") Para habilitar cotas, o script define o valor da propriedade State para a constante ENFORCE_QUOTAS e chama o método Put_ para gravar essa alteração no sistema operacional. E se você quiser desabilitar as cotas de disco em uma unidade? Nesse caso, basta definir o valor da propriedade State como 0. Para fazê-lo, crie uma constante chamada DISABLE_QUOTAS, defina o seu valor como 0 e o valor da propriedade State como DISABLE_QUOTAS. O script concluído terá um aspecto horrível como este: Const DISABLE_QUOTAS = 0 StrComputer = "." Set coldisks = objwmiservice.execquery _ ("Select * from Win32_QuotaSetting Where VolumePath = 'C:\\'")'")
8 For Each objdisk in coldisks objdisk.state = DISABLE_QUOTAS objdisk.put_ Observe que ao desabilitar as cotas de disco, as informações da cota existente não são descartadas. Por exemplo, qualquer configuração de cota que você tenha definido ou qualquer entrada de cota criada continuará existindo. Contudo, essas configurações não serão aplicadas e a utilização do espaço em disco para cada indivíduo com uma entrada de cota não será atualizada. Se posteriormente as cotas de disco forem reabilitadas, as configurações anteriores e as entradas de cota serão automaticamente restauradas, sem que seja necessário recriá-las. Não desperdice, não deseje, como nós da Equipe de Scripts costumamos dizer. Modificando as configurações das cotas de disco Uma das maiores vantagens da classe Win32_QuotaSetting é o fato de a maioria das propriedades ser de leitura/gravação, ou seja, o uso do script não se limita à recuperação de valores de propriedades como a DefaultLimit e a DefaultWarningLimit, mas também possibilita a sua modificação. Por exemplo, esse script modifica as configurações das propriedades DefaultLimit e DefaultWarningLimit para todas as unidades NTFS de um computador: strcomputer = "." Set colquotasettings = objwmiservice.execquery _ ("Select * from Win32_QuotaSetting") For Each objquotasetting in colquotasettings objquotasetting.defaultlimit = objquotasetting.defaultwarninglimit = objquotasetting.put_ Next Como você pode ver, basta atribuir um novo valor (em KB) e chamar o método Put_ para gravar as novas configurações de cota no sistema operacional. Observe que ao fazer isso, as configurações revisadas da cota serão aplicadas apenas aos novos usuários e não aos usuários que já possuem entradas de cotas de disco na unidade. Por exemplo, suponha que você tem três usuários com entradas de cotas de disco em uma unidade:
9 Usuário Limite de cota Limite de aviso KMyer PAckerman RWilliams 100 MB 90 MB 200 MB 180 MB 400 MB 350 MB Então você executa um script que altera as definições de cota padrão para um limite de cota de 50 MB e um limite de aviso de 40 MB. Esses valores serão aplicados a qualquer novo usuário que salvar um arquivo ou criar uma pasta na unidade. Contudo, as definições de cota para os três usuários mencionados acima não serão afetadas, eles manterão suas configurações mesmo que possuam um limite de cota bem superior do que o máximo definido de 50 MB. Tudo bem: afinal, as definições de cota consistem em um valor padrão, que será aplicado a todos os novos usuários a menos que seja especificado de outra forma. Em outras palavras, é perfeitamente possível ter usuários individuais com valores de definições de cota maiores ou menores do que os valores padrão. E se você quiser aplicar esses mesmos valores aos três usuários existentes? Nesse caso, será necessário alterar os valores de cada entrada de cota individual do usuário. E isso, por acaso, nos leva a próxima seção. Gerenciando cotas de disco para usuários individuais Sempre que um novo usuário salvar um arquivo em uma unidade em que as cotas de disco foram habilitadas, uma entrada de cota é criada para ele. A entrada de cota mantém o controle dos limites de cota e de aviso, atribuídos ao usuário, bem como a quantidade de espaço em disco atualmente destinada a ele. Na verdade, a entrada de cota é bastante semelhante à classewin32_diskquota do WMI, que pode ser usada para criar, excluir, modificar e reportar entradas de cota individual. A tabela abaixo mostra as propriedades da classe Win32_QuotaSetting: Propriedade Descrição DiskSpaceUsed Número atual de KB (quilobytes) em uso por um determinado usuário. Limit Definição de limite para determinado usuário. Essa propriedade é leitura/gravação. QuotaVolume Volume no qual a entrada de cota está armazenada.
10 Status User Status atual da cota de disco. Os valores são: 0.. OK: o usuário está dentro do limite de sua cota. 1.. Aviso: o usuário excedeu o limite de aviso, mas ainda não ultrapassou o limite de sua cota. 2.. Excedido: o usuário excedeu o limite de sua cota. Usuário relacionado à entrada de cota. WarningLimit Definição do limite de aviso para determinado usuário. Essa propriedade é leitura/gravação. Essas propriedades também podem ser mapeadas para os elementos da interface do usuário, encontrados na caixa de diálogo Entradas de Cota: Observação.. Como encontrar a caixa de diálogo Entradas de Cota?? Na pasta Meu Computador, clique com o botão direito do mouse na unidade de disco desejada e clique empropriedades. Na caixa de diálogo Propriedades, clique na guia Cota e em Entradas de Cota. As cotas de disco se aplicam aos arquivos e pastas de propriedade de um usuário. (Os arquivos e as pastas pertencerão apenas a usuários e não a grupos, sem exceção, é por isso que as cotas de disco só podem ser atribuídas a usuários.) Eis algumas notas interessantes: As cotas de disco são baseadas na propriedade do arquivo. Imagine que o Usuário A criou um novo arquivo em branco. Então o Usuário A possui 0 MB de espaço em disco. Contudo, suponha que o Usuário B, com acesso leitura/gravação, abra o arquivo e insira nele várias imagens baixadas da Internet. O arquivo atinge um tamanho de 40 MB, toda a cota atribuída ao Usuário A, o proprietário do arquivo. É claro que alguns aplicativos alteram automaticamente o proprietário do arquivo e atribuem esse status ao último usuário que modificou o arquivo. Nesse caso, os
11 40 MB de espaço em disco seria cobrado do Usuário B, porque ele agora é o proprietário do arquivo. As cotas de disco se baseiam no tamanho descompactado de um arquivo. A compactação de um arquivo não altera a a quantidade de espaço em disco utilizada pelo proprietário do arquivo. (Sim, sabemos: também pretendíamos fazer isso, mas não funcionaria.) As cotas de disco são inteligentes: quando elas são habilitadas, a quantidade de espaço em disco livre reportada ao usuário é baseada em seu limite de cota e não no tamanho da unidade. Por exemplo, suponha que um usuário tenha recebido 1 GB de espaço de cota em uma unidade com 50 GB. Se o usuário verificar imediatamente a quantidade de espaço em disco disponível na unidade, ele será informado que possui 1 GB livre, portanto, o espaço em disco disponível para o usuário está baseado em sua cota. Ele nunca saberá sobre os outros 49 GB de espaço em disco da unidade. Por padrão, os administradores possuem espaço em disco ilimitado em uma unidade (limitado pela quantidade de espaço em disco real), na verdade, quando você habilita as cotas de disco, o grupo Administradores é automaticamente adicionado à tabela de entrada de cotas, recebendo espaço em disco ilimitado. Não é aconselhável alterar esse padrão. Se você remover o grupo Administradores da tabela de entrada de cotas ou se limitar o espaço em disco disponível para os administradores, a capacidade de gerenciamento do seu computador pode ser seriamente prejudicada. Observação.. Qualquer arquivo criado por um administrador é de propriedade do grupo Administradores e não de apenas um administrador. Essa é a exceção mencionada anteriormente. Você pode configurar uma entrada de cota de disco para o grupo Administradores e não para qualquer outro grupo. (Sim, é injusto. Mas se consultarmos rapidamente a lista de ditados populares, não encontraríamos um que dissesse A vida é justa.) Conforme observado anteriormente, um dos maiores obstáculos para implementar as cotas de disco no Windows 2000 foi a falta de ferramentas úteis para gerenciamento. Por exemplo, imagine que você quisesse gerar um relatório mostrando todas as entradas de cota de disco para todas as unidades de um computador. No Windows 2000, isso é bastante complicado. o. Se desejar imprimir informações ou salvar dados em um arquivo de texto, nem adianta usar o utilitário Entradas de Cota de Disco.. Da mesma forma, ao
12 mesmo tempo que você poderiaescrever um script usando o objeto Shell, seria necessário incluir uma quantidade considerável de código, somente para identificar e conectar todas as unidades do computador. Se não for complicado não vale a pena. (Parecido com o ditado Sem dor, sem ganho.) Então seria mais fácil no Windows 2003? Bem, este é um script que fará exatamente isso: retornará as informações sobre todas as entradas de cota para todas as unidades de um computador com apenas algumas linhas de código: strcomputer = "." Set coldiskquotas otas = objwmiservice.execquery("select * from Win32_DiskQuota") For Each objquota in coldiskquotas Wscript.Echo "Disk Space Used: " & objquota.diskspaceused Wscript.Echo "Limit: " & objquota.limit Wscript.Echo "Quota Volume: " & objquota.quotavolume Wscript.Echo "Status: " & objquota.status Wscript.Echo "User: " & objquota.user Wscript.Echo "Warning Limit: " & objquota.warninglimit Wscript.Echo Next Excelente, hein? Mas vai ficar ainda melhor. Esse é o WMI que pode ser usado para criar consultas que retornam um conjunto de informações mais direcionado. Por exemplo, talvez você queira uma coleção de todos os usuários que excederam seus limites de cota (ou seja, todas as entradas de cota com a propriedade Status definida ida como 2). Nesse caso, basta usar uma consulta WQL como esta: Set coldiskquotas = objwmiservice.execquery _ ("Select * from Win32_DiskQuota Where Status = 2") Este é outro exemplo de consulta, um que retorne uma lista de todos os usuários que, independentemente ndentemente de suas definições de cota, usaram mais de 1 GB de espaço em disco: Set coldiskquotas = objwmiservice.execquery _ ("Select * from Win32_DiskQuota Where DiskSpaceUsed > ")
13 Novamente, é isso que torna o script uma excelente forma de gerenciar itens como as cotas de disco. Investindo relativamente pouco tempo você pode criar uma ferramenta de gerenciamento que funciona exatamente como você precisa. Casualmente, quando um usuário atinge o seu nível de cota, um evento é gravado no log de eventos do sistema no computador em que a violação do limite de cota ocorreu. Contudo, nenhuma notificação é enviada ao usuário. Ele nunca saberá que está se aproximando de seu limite de cota até tentar salvar um arquivo e tiver o acesso negado por falta de espaço em disco disponível. Por que mencionamos isso? Bem, você poderia facilmente escrever um script para retornar uma lista com os usuários que excederam o limite de aviso ou de cota, e solicitar que esse script envie um para cada usuário notificando-os os sobre sua situação, talvez até oferecendo sugestões para que eles possam liberar mais espaço em disco. Tente fazer isso com as ferramentas de gerenciamento de cotas de disco incorporadas no sistema operacional. Recuperando uma entrada única de cotas de disco Neste momento, já seria óbvio que as novas classes WMI encontradas no Windows Server 2003 e no Windows XP facilitam bastante o gerenciamento das configurações da cota de disco e das entradas de cota globalmente, ou seja, em todas as unidades de um computador. Contudo, também é possível gerenciar entradas de cota individuais. Por exemplo, o script a seguir, visualmente assustador, recupera o limite de cota para o usuário fabrikam\kenmyer kenmyer na unidade C de um computador: strcomputer = "." strdrive = "C:" strdomain = "fabrikam" struser = "kenmyer" 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) & "'")
14 Wscript.Echo objquota.limit Na verdade, a maioria dos scripts é bastante simples, com apenas uma exceção: a consulta WQL usada para recuperar a entrada de cota. Como você pôde observar, a consulta é composta por E comercial, aspas simples e duplas e todos os tipos de sinais de pontuação. Não é uma bela visão (embora a beleza esteja nos olhos de quem vê), mas é a maneira como as entradas de cota individuais são rastreadas pelo WMI. Por exemplo, esta é a aparência de uma instância de entrada de cota no Wbemtest: Em outras palavras, para o melhor ou para o pior (provavelmente é o pior), a principal propriedade de uma entrada de cota de disco é uma amalgamação das classes Win32_DiskQuota,Win32_LogicalDiskWin32_LogicalDisk e Win32_Account.. E não há como reverter isso. Mas não se preocupe. O script anterior foi criado para facilitar modificações e usos. Parte do motivo de a consulta WQL ter uma aparência tão criptográfica se deve à utilização de variáveis para representar a unidade, o usuário e o domínio do usuário. Para usar o script, basta atribuir os valores corretos às três variáveis que representam essas propriedades: strdrive = "C:" strdomain = "fabrikam" struser = "kenmyer" Modificando uma entrada das cotas de disco As propriedades Limit e WarningLimit são leitura/gravação: isso significa que você pode usar um script para modificar os valores dessas propriedades. Por exemplo, este é um script que modifica o valor da propriedade Limit da unidade C para o usuário fabrikam\kenmyer:
15 strcomputer = "." strdrive = "C:" strdomain = "fabrikam" struser = "kenmyer" 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) & "'") objquota.limit = objquota.put_ Como sempre, verifique se chamou o método Put_ depois de atribuir novos valores. Se o método Put_ não for chamado, não haverá geração de erros e nenhuma mudança será realizada na entrada de cota. Claro que você também poderia alterar a propriedade Limit para todos os usuários da unidade. Este é um script que fará exatamente isso: strcomputer = "." Set coldiskquotas = objwmiservice.execquery _ ("Select * from Win32_DiskQuota Where QuotaVolume = 'C:\\'")'") For Each objquota in coldiskquotas objquota.limit = objquota.put_ Next Excluindo uma entrada das cotas de disco Às vezes, o gerenciamento das cotas de disco não envolve mais do que solucionar equações matemáticas simples. Por exemplo, imagine que você tem 100 usuários e 100 GB de espaço disponível em disco. Se desejasse, se, você poderia simplesmente dividir a quantidade de espaço em disco disponível pelo número de usuários e, assim, alocar 1 GB para cada um deles. Claro que esse tipo de cálculo é útil apenas se os números envolvidos forem válidos. Se você tiver 50 usuários, s, pode estar enganando a todos, mas se forem 200 você estará
16 alocando mais espaço em disco do que o total disponível. Por isso, é necessário manter o controle sobre o total de espaço em disco disponível e o número de entradas de cota na unidade. E para fazê-lo posteriormente, será necessário excluir rotineiramente as entradas de cota inválidas, como por exemplo, as entradas de cota de indivíduos que não pertencem mais à organização ou que não têm mais acesso à unidade. (Você terá que fazer isso manualmente, porque as entradas de cota não são automaticamente apagadas sempre que uma conta de usuário é excluída.) Felizmente, essa é outra tarefa que pode ser realizada com um script. Para excluir uma entrada de cota, tudo o que você tem a fazer é se conectar a essa entrada e então chamar o método Delete_.. Não é necessário chamar o método Put_ para gravar as alterações no sistema operacional. Em vez disso, no momento que chamar o método Delete_, a entrada de cota será excluída. Este é um script que exclui a entrada a de cota da unidade C para o usuário fabrikam\kenmyer: Como sempre, verifique se chamou o método Put_ depois de atribuir novos valores. Se o método Put_ não for chamado, não haverá geração de erros e nenhuma mudança será realizada na entrada de cota. Claro que você também poderia alterar a propriedade Limit para todos os usuários da unidade. Este é um script que fará exatamente isso: strcomputer = "." strdrive = "C:" strdomain = "fabrikam" struser = "kenmyer" 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) & "'") objquota.delete_
17 Lembre-se de que a exclusão de uma entrada de cota não afeta a capacidade do usuário de armazenar arquivos na unidade. Suponha que você excluiu a entrada de cota para Ken Myer e, em seguida, ele tenta armazenar um arquivo nessa unidade. Ken terá seu acesso negado à unidade? Não, ele poderá salvar o arquivo e uma nova entrada de cota será criada para ele. Se quiser evitar que um usuário salve arquivos em uma unidade, você terá que usar as permissões NTFS em vez das cotas de disco. Lembre-se também de que não é possível excluir uma entrada de cota para qualquer usuário que possua arquivos armazenados na unidade. Para isso, será necessário excluir ou mover esses arquivos, ou ainda apropriar-se deles es antes de excluir a entrada de cota. Criando uma nova entrada das cotas de disco Conforme observado anteriormente, não é preciso criar uma nova entrada de cota para cada novo usuário que salvar um arquivo na unidade. É para isso que a cota e os limites de aviso padrão existem. Quando um usuário salva um arquivo, o sistema operacional verifica o usuário e suas definições de cota. Se o usuário não possuir uma entrada de cota existente, o sistema criará automaticamente uma nova com base nas configurações padrão. Isso facilita bastante a administração das cotas de disco. No entanto, pode haver casos em que você não queira aplicar essas configurações padrão a um usuário. Por exemplo, talvez você queira atribuir mais espaço em disco para artistas gráficos do que o concedido às recepcionistas. Em um caso como este, você poderia esperar até que o artista gráfico salvasse um arquivo no disco, gerando assim uma nova entrada de cota com base nas configurações padrão, e, em seguida, usar um script para modificá-las. Alternativamente, você poderia economizar tempo e evitar problemas usando um script para criar uma entrada de cota antecipadamente, atribuindo espaço em disco adicional para esse usuário, desde o princípio. Seja prevenido: o script para criar uma nova entrada de cota parece estranho. Contudo, o script de exemplo também foi criado para facilitar o uso: tudo o que você precisa fazer é atribuir os valores corretos para a unidade, o nome de usuário e o domínio. Então poderá usá-lo na forma como está. strcomputer = "." strdrive = "C:" strdomain = "fabrikam" struser = "kenmyer" Set objaccount = objwmiservice.get _
18 ("Win32_Account.Domain='" & strdomain & "',Name='" & struser & "'") Set objdisk = objwmiservice.get _ ("Win32_LogicalDisk.DeviceID='" & strdrive & "'") Set objquota = objwmiservice.get _ ("Win32_DiskQuota").SpawnInstance_ objquota.quotavolume = objdisk.path_.relpath objquota.user = objaccount.path_.relpath objquota.limit = objquota.warninglimit = objquota.put_ Sim, sabemos: esse script é um pouco mais complicado do que os outros. Isso se deve em grande parte ao fato de que precisamos criar referências de objeto que representam a conta do usuário (objaccount) e a unidade em que a entrada de cota será criada (objdisk). É o que fazemos nessas duas linhas de código: Set objaccount = objwmiservice.get _ ("Win32_Account.Domain='" & strdomain & "',Name='" & struser & "'") Set objdisk = objwmiservice.get _ ("Win32_LogicalDisk.DeviceID='" & strdrive & "'") Assim que conseguimos essas duas referências de objeto, podemos usar o método SpawnInstance_ para criar uma entrada de cota em branco. Depois, simplesmente especificamos os valores das propriedades QuotaVolume, User, Limit e WarningLimit. A parte complicada é a utilização da propriedade Path_.RelPath das duas referências de objeto ao definir os valores das propriedades QuotaVolume e User. Os valores da propriedade Path_.RelPath para a unidade de disco e para o usuário possuem uma aparência semelhante a esta: Win32_LogicalDisk.DeviceID="C:" Win32_UserAccount.Domain="fabrikam",Name="kenmyer" Usamos a propriedade Path_.RelPath convenientemente: é um pouco mais clara e limpa do que aquelas outras seqüências de caracteres concatenadas e complicadas E comercial, aspas duplas e simples. E, claro, o método Put_ é usado para criar a entrada de cota.