Apagando arquivos antigos no Powershell com uma linha... passo a passo

Olá, Essa veio do fórum: como apagar arquivos antigos? Essa questão é velha, sempre aparece, e existem 6x10^23 respostas. Resolvi postar uma interessante que mandei na lista, mas mostrando passo a passo como foi meu raciocínio ao criar o "brinquedo": assim eu respondo a dúvida de um monte de gente que ainda não achou outras soluções (aqui mesmo no blog eu já postei uma solução com VBScript, e no forum surgiu uma solução com o Purge.exe) ao mesmo tempo que explico como montar uma linha de comando no Powershell. 1) Comece listando todos os arquivos, na pasta que deseja limpar, com o comando get-childitem (é mais fácil dir ou ls. Uso o ls porque estou acostumado também com outro SO): alonenomad@monad Meus Documentos\> ls Directory: Microsoft.PowerShell.Core\FileSystem::D:\Vinicius\Meus Documentos Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 20/11/2006 11:12 Apresentações d---- 22/5/2006 0:14 BVRP Software d---- 15/12/2004 17:12 CS sounds d---- 12/11/2005 0:23 EESC - Biblioteca d---- 8/9/2006 23:06 Faculdade d---- 25/6/2006 18:38 Meus arquivos recebidos d---- 15/5/2006 0:41 Microsoft Articles d-r-- 5/11/2006 16:58 Minhas imagens d---- 20/8/2006 11:40 My Virtual Machines 2) Agora filtre os antigos com o where-object (também conhecido como where ou como ?): alonenomad@monad Meus Documentos\> ls | where {$_.lastwritetime -lt (date).adddays(-5)} Directory: Microsoft.PowerShell.Core\FileSystem::D:\Vinicius\Meus Documentos Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 20/11/2006 11:12 Apresentações d---- 22/5/2006 0:14 BVRP Software d---- 15/12/2004 17:12 CS sounds d---- 12/11/2005 0:23 EESC - Biblioteca d---- 8/9/2006 23:06 Faculdade d---- 25/6/2006 18:38 Meus arquivos recebidos d---- 15/5/2006 0:41 Microsoft Articles d-r-- 5/11/2006 16:58 Minhas imagens d---- 20/8/2006 11:40 My Virtual Machines Note que esse where foi mais complicado. Dentro do where, eu só mostro os arquivos cuja data de última escrita é menor que hoje - 5 dias. Ou seja, pego arquivos antigos. Pra fazer isso, eu me utilizo do $_, a variável que representa o próprio arquivo e a propriedade lastwritetime. Além disso, para fazer a conta com a data atual eu uso (date).addDays(-5), que corresponde ao comando get-date, que retorna a data/hora atual, e uso o método addDays, que soma dias nessa data... soma, com menos 5 dias. Depois é só comparar com o -lt que corresponde a Less Than, ou menor que, no Powershell. Cuidado... você não pode comparar simplesmente usando > ou <, pois eles são usados para redirecionamentos. 3) Agora apaga! ou quase. veja como eu fiz pra apagar os arquivos... sem apagar nada. É só usar um foreach, que vai executar o comando rm para cada ítem que chegar pelo pipe. eu usei o parâmetro -WhatIf, que, ao invés de apagar, mostra o que seria acontecido... só para fins de teste antes de botar meu super script de uma linha em ação. PS: Coloquei com uma fonte menor pra ficar mais fácil pra ler =)... sem quebras de linha. alonenomad@monad Meus Documentos\> ls | where {$_.lastwritetime -lt (date).adddays(-5)} | foreach {rm $_ -whatif} Confirm The item at D:\Vinicius\Meus Documentos\Apresentações has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): a What if: Performing operation "Remove Directory" on Target "D:\Vinicius\Meus Documentos\Apresentações". Confirm The item at D:\Vinicius\Meus Documentos\BVRP Software has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): a What if: Performing operation "Remove Directory" on Target "D:\Vinicius\Meus Documentos\BVRP Software". Confirm The item at D:\Vinicius\Meus Documentos\CS sounds has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): a What if: Performing operation "Remove Directory" on Target "D:\Vinicius\Meus Documentos\CS sounds". Confirm The item at D:\Vinicius\Meus Documentos\EESC - Biblioteca has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): a What if: Performing operation "Remove Directory" on Target "D:\Vinicius\Meus Documentos\EESC - Biblioteca". Confirm The item at D:\Vinicius\Meus Documentos\Faculdade has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): a What if: Performing operation "Remove Directory" on Target "D:\Vinicius\Meus Documentos\Faculdade". . . . What if: Performing operation "Remove Directory" on Target "D:\Vinicius\Meus Documentos\WindowsPowershell". What if: Performing operation "Remove File" on Target "D:\Vinicius\Meus Documentos\alonenomad.png". What if: Performing operation "Remove File" on Target "D:\Vinicius\Meus Documentos\AssinaturaEmail.txt". What if: Performing operation "Remove File" on Target "D:\Vinicius\Meus Documentos\AssinaturaNG.txt". What if: Performing operation "Remove File" on Target "D:\Vinicius\Meus Documentos\Calendário de Provas 2sem 2005.doc". What if: Performing operation "Remove File" on Target "D:\Vinicius\Meus Documentos\Carta.doc". What if: Performing operation "Remove File" on Target "D:\Vinicius\Meus Documentos\Controle Financeiro.xls". What if: Performing operation "Remove File" on Target "D:\Vinicius\Meus Documentos\Dados dos Petianos.doc". . . . alonenomad@monad Meus Documentos\> Pronto. Espero que gostem! Vinicius

Categorias dessa postagem:

Powershell e comandos antigos: como obter o endereço IP, por exemplo

Olá, depois de ver uma dúvida na lista MCPdx (que eu ajudo a moderar), resolvi escrever sobre como funciona o suporte aos comandos antigos no Powershell. A idéia é muito simples: todos os comandos novos, cmdlets e scripts, trabalham e retornam objetos, que o shell se encarrega de organizar, listar e converter para texto que pode ser exibido na tela. Comandos antigos são executados e sua saída é convertida para String. Ok, agora vamos ao exemplo visto na lista. Perguntaram como obter somente o IP da máquina local em um script. Sabemos que existem duas formas de se obter o endereço IP: Comando ipconfig Comando netsh interface ip show address O trabalho agora é somente tratar o texto que os comandos retornam ao Powershell: (ipconfig)[14].split(' ')[-1] ou (netsh interface ip show address)[3].split(' ')[-1] A idéia é muito simples. Primeiro, pegamos a décima quarta ou terceira linha da resposta do comando (ipconfig ou netsh ip interface show address). Isso nos retorna somente uma linha do vetor de linhas que é a saída do comando. A seguir, usamos o método Split (da classe String), que quebra uma linha em um vetor sempre que encontrar um caractere específico... neste caso, o espaço. No final, pegamos a última posição do vetor, que é o IP da máquina (esse [-1] é uma forma de se obter elementos de um vetor, ao estilo do Python ou Ruby. Tem no Powershell também). Simples não? []s, Vinicius

Categorias dessa postagem:

Acelere seu teclado! Dicas sobre o melhor dispositivo de entrada que existe

Olá, ultimamente tenho ficado pouco tempo online. Na verdade, estou na frente do computador quase o tempo todo. O problema é que boa parte desse tempo estou trabalhando ou ocupado com alguma coisa importante. Isso explica a minha ausência no blog ultimamente. (Ninguém acredita... mas o difícil não é passar na Fuvest. Difícil mesmo é se formar na USP, mais ainda com o curriculum sem nenhuma "baixa".) Para não dizer que eu não coloco mais nada aqui, vou mandar algumas coisas que eu andei lendo ultimamente na Internet sobre o melhor dispositivo de entrada já inventado na minha opinião: o teclado:

Scripting, Sendkeys e o PrintScreen

Pra começar: scripting. Você pode simular a digitação de teclas em scripts usando um método muito simples do Windows Script Host chamado Sendkeys. Ele foi desenvolvido para que aplicações antigas, que não suportam automação (COM Automation, que permite controlar um aplicativo com scripting. Internet Explorer, Outlook Express e Office em geral não precisam disso) pudessem ser automatizadas usando scripts. E é claro, se a aplicação não oferece suporte à scripting, a única saída é simular uma pessoa digitando alguma coisa, ok? No entanto, ele tem alguns detalhes. Na documentação oficial aparece uma referência sobre como "digitar" algumas coisas diferentes, como por exemplo um Ctrl + C. Até aí tudo bem, funciona legal. Com o que tem lá dá pra simular bastante coisa. O problema é quando você precisa apertar um PrintScreen. Não funciona. Aliás, essa parece ser a única tecla que não pode ser simulada. Procurei bastante na documentação, sem sucesso, até que encontrei na Internet mesmo porque isso acontece: o PrintScreen não pode ser enviado como sinal para nenhuma janela, porque ele não é associado à nenhuma janela. Como o Sendkeys precisa enviar dados para uma janela, o comando falha. Um workaround é usar programinhas simples para bater screenshots e salvar direto em arquivos de imagem (precisei disso em um trabalho na faculdade para bater mais de 100 screenshots da tela e deu tudo certo: economizei bastante tempo).

Acelere seu teclado!

Essa é rara: você sabe que pode aumentar a velocidade de alguns teclados, apenas usando uma função dele que ninguém conhece? Pois bem, essa eu não conhecia também... até cair em um site que falava disso. Se você tem um teclado parecido com esse teclado Mitsuko (aqui no Brasil tem toneladas de teclados genéricos que se parecem com esse, especialmente os Mtek, Troni e coisas parecidas), comece a pular de alegria. Esse teclado tem uma tecla Fn no canto e umas setinhas junto às teclas F1 - F7. Essas teclas, combinadas, aceleram a taxa de envio de sinais pro micro... até um máximo de 100Hz (segundo informações de um desconhecido nesse site). Isso é fantástico, principalmente para quem joga e para quem programa no computador. Além disso, existem 2 ou 3 programas na Internet que permitem acelerar o teclado, configurando taxas mais altas que o Windows permite. Aqui tem um deles. Aliás, porque o Windows permite no máximo 32 caracteres/segundo?

Teclados DVORAK

Já ouviu falar de teclados QWERTY? E dos teclados DVORAK? Pois bem, a história deles é a seguinte: o primeiro foi inventado para ser um padrão para máquinas de escrever, e as teclas são dispostas seguindo uma lógica que permite (num texto em Inglês) que as pessoas não precisem digitar duas teclas com a mesma mão na sequência. Isso porque, na máquina de escrever, duas teclas na sequência podem fazer ela "travar", enquanto uma tecla desce e outra sobe. Parece linda a lógica... mas nada tem a ver com Português nem com computadores. Computador não trava da mesma forma que a máquina de escrever, e não faz sentido usar QWERTY nele. Pensando nisso o Dr. August Dvorak desenvolveu um melhor, que busca colocar as teclas mais comuns no centro do teclado, procurando usar os dedos mais rápidos e fortes com mais frequência. A história também parece bonita... mas aparentemente o Sr. Dvorak "maquiou" alguns de seus testes, e tempos depois um estudo feito provou que ele estava errado. Entretanto, quem usa DVORAK garante que é melhor, mais confortável que o QWERTY e um pouco mais rápido (pelo que eu andei lendo, entre 10% e 35%) quando você está acostumado. No site em que eu encontrei informações sobre isso, o autor discute como ele fez para se acostumar e o que achou depois de ter mudado. Nesse link também tem vários outros sobre teclados DVORAK. Antes que me perguntem, você não precisa comprar outro teclado. Basta configurar o Windows para usar o outro layout e pintar o seu (ou guardar as teclas na cabeça... ). Em algum tempo você digitará mais rápido.

Conclusões abstratas sobre o teclado sob o meu ponto de vista

O teclado é absurdamente mais útil que o mouse. Basta contar quantos botões tem cada um deles. Existem "atalhos de teclado", não "atalhos de mouse" Um teclado com 105 teclas tem 5460 combinações diferentes de atalhos de duas teclas. Se contarmos só o Ctrl, Shift e Alt, teríamos 306 combinações diferentes. Você pode configurar quase todas elas, dependendo do Shell que você usa (Explorer, por exemplo... ou bbLean, por exemplo. Mas esse é motivo pra outro post). Agora olhe para seu mouse de 5 botões. Não é possível jogar em quase nenhum jogo sem o mouse. Também não é possível programar rapidamente sem utilizar um teclado. Bom, é só. Espero que gostem. Vinicius

Categorias dessa postagem: ,

PCeX - Inventário de Hardware e Software

Olá pessoal, faz um tempo que o pessoal me pede para colocar aqui o link para o PCeX, aquele script para inventário de hardware e software. Finalmente lembrei de fazer isso. Devido ao pouco tempo livre das pessoas que desenvolveram, o ritmo de atualizações dele caiu bastante... ficou quase tudo nas mãos do Arthur Aragão, que chegou a começar uma "versão 2.0" dele. Estou enviando a última que tenho, a 1.5. Note que é apenas um script, criado por pessoas do fórum, com o único objetivo de atender as suas necessidades. É criação nossa mesmo, da época do antigo fórum do Technet, antes mesmo do newsgroup. Vejam os nomes dos desenvolvedores no próprio código e no PCeX (eu sou um deles!). Segue o link, publicado no Technet Brasil. []s, -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog sobre Scripting: http://viniciuscanto.blogspot.com

Categorias dessa postagem: , , ,

Vista, scripting e Powershell

Olá, descobri agora de tarde que o link que passei inicialmente está fora do ar. Motivo: mandei cedo demais. O Powershell foi lançado hoje pela manhã, e provavelmente os arquivos ainda não foram propagados para os outros servidores de download. É o preço que se paga por ser o primeiro a noticiar alguma coisa... =). Bom, ficou sabendo por aqui, viu primeiro antes de todo mundo. E amanhã o link deve estar ok. Se mudar eu corrijo aqui no blog. Quanto ao Vista, algumas coisas interessantes. O Vista tem um suporte melhor ainda quanto à scripting. Além do Powershell, ele inclui novas funcionalidades no WMI (aumentou um pouco o número de classes) e chaves de registro/GPOs para gerenciar os novos recursos de segurança dele (BitLocker e UAC, por exemplo). O detalhe mais curioso: até o 2003 SP1 e XP SP2, não havia uma forma de desabilitar/reiniciar uma placa de rede usando WMI. Não havia... agora tem como. Criaram o tão pedido método Disable() pra fazer isso. Hoje ainda saiu um outro post no blog oficial do Powershell sobre como usar alguns desses recursos do Vista no Powershell. Segue o link pra quem se interessar. Obrigado! E torçamos pro download funcionar amanhã...

Categorias dessa postagem: , , , , , , ,

POWERSHELL 1.0 FINAL: Lançado hoje

Olá é com grande prazer que comento aqui que o Windows Powershell acaba de ser lançado (mais precisamente, no ITForum em Barcelona). Saiu um post no blog oficial do Powershell hoje, às 10:43. Imagino que eu seja o primeiro blogueiro brasileiro a noticiar isso por aqui pelas terras tupiniquins. Segue o link para o download. Para quem ainda não sabe ou chegou ao meu blog perdido, por meio de um site de busca, vou explicar. Windows Powershell é o nome do próximo prompt de comandos do Windows, uma nova geração, criada do zero, combinando o que há de melhor em várias tecnologias e linguagens de programação, incluindo algumas livres: VBScript, CMD Prompt, Ruby, AWK, Python, Perl, Bash, e aí vai... a lista é grande. O Powershell permite um melhor gerenciamento e automatização de ambientes em rede, tanto em desktops quanto em servidores. Pra quem gosta de resolver problemas rapidamente, usando scripts, recomendo estudar isso. Trabalhar nele pode ser um diferencial para você. Ah, esqueci do melhor: é gratuito. Ao contrário do que alguns pensam, a idéia não é nem de longe substituir o Windows Script Host + VBScript, nem mesmo fazer com que você atualize seus scripts. Dá trabalho e não é essa a idéia. Você continuará usando os dois... Powershell é só uma ferramenta que permite fazer quase tudo que você fazia em VBScript, usando um shell e de forma absurdamente mais rápida. Vou continuar escrevendo sobre os dois aqui. Sem preconceitos. Obrigado! Vinicius - baixando o 1.0 Final

Categorias dessa postagem:

Segurança e senhas

Olá a todos. Recentemente um especialista em segurança, Fernando Cima, comentou em seu blog uma dúvida curiosa: o que é mais forte: uma senha pequena, mas complexa ou uma senha longa que usa caracteres simples, minúsculos? O texto é muito bom. A referência do artigo que ele selecionou também. Tanto que eu resolvi comentar lá e acabei escrevendo bastante, com alguma prova matemática embutida. Acabei de postar, mas ele deve aprovar nos próximos dias. Vejam o que eu concluí com o artigo dele, com o do Infoworld e com as minhas contas (início do comentário postado no blog do Fernando) Olá Cima, mto bom o post, gostei. Resolve, dentre outras coisas, um problema que incomoda muitos usuários, ainda mais os que não tem tanta experiência: a senha de 8 complexa caracteres. É realmente mais difícil memorizar uma senha complexa do que uma longa que seja mais simples. Só pra tornar o resultado do teste mais palpável, resolvi pedir ajuda pra minha namorada (que faz Mat. Aplicada/USP. Obrigado amor!) pra validar meu raciocínio: - Senha complexa: 94 caracteres possíveis, segundo link que você passou. Vou usar 100 pra facilitar as contas no meu exemplo, o que teoricamente deixa a senha complexa mais complexa ainda (até porque nem sei quais são esses 6 caracteres a mais...) - Senha simples: 26 caracteres (tô desconsiderando o cedilha). Usando esses dados, uma senha complexa de 8 caracteres tem, portanto, 100^8 = 10 quatrilhões. Uma simples de 11 caracteres tem 26^11 = pouco mais* que 3 quatrilhões. Só que, se você pegar 12 caracteres, esse número passa pra mais de 95 quatrilhões... e portanto a senha simples de 12 dígitos é só umas nove vezes e meia mais forte que a complexa de 8. No exemplo do artigo ele usa uma de 15, que passa de 1 sextilhão (nem sei se a palavra certa é essa). O desafio dele era, na verdade, uma complexa de 10 contra uma simples de 15, mas a de 10 daria 10 quintilhões, que continua sendo cerca de 16x mais fraca que a de 15. Ele sabia que a chance de perder os 100 dólares era pequena. No entanto, devemos tomar um certo cuidado. Incentivar senhas simples também pode complicar o trabalho se as senhas forem passphrases. Caso o programa usado pra quebrar a senha tenha um ótimo dicionário (nos termos da Física, um dicionário ideal =), o tempo pra se quebrar as senhas fica menor. Mesmo assim, o testador não tem como descobrir que a senha é uma passphrase, e um caractere fora do padrão dele complica tudo. Por outro lado, se tiver mais de um computador testando o hash, o tempo necessário para quebrar cai pela metade... e assim por diante quanto maior o número de computadores. Como vocês podem ver, as possibilidades de mudança no teste são grandes, e isso passa a não ter muita validade se você quiser levar em conta todas elas. Em resumo: senhas simples entre 15 e 17 caracteres são muito melhores do que as complexas de 8. Adicione à isso uma política de troca de senhas a cada dois meses, você estará "matematicamente seguro" contra o poder de processamento dos computadores dos dias de hoje. Abraços e parabéns. Essa vai pro meu blog também. -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog sobre Scripting: http://viniciuscanto.blogspot.com *pouco mais aqui foi uma ironia... qualquer arredondamento com números dessa ordem dá bastante diferença.

Categorias dessa postagem: ,

Como modificar ou acessar o conteúdo de um arquivo rapidamente no Powershell

Olá, conforme comentei um tempo atrás, foi lançado pela O'Reilly um livro sobre Powershell. É um livro pequeno, um guia rápido, feito por Lee Holmes, outro cara que entende bastante do assunto. Ótimo para quem tem noção do que é criar um script, já brinca um pouco com VBScript +WSH e quer aprender Powershell. Estou lendo, e no final pretendo escrever uma avaliação e publicar aqui, pra ajudar quem tiver interesse em livros sobre o Powershell (bom ou não, vou escrever aqui). Aprendi um truque curioso lá: como escrever e ler arquivos de uma forma muito rápida. É simples. Imagine que o arquivo que você quer ler já está em uma variável... é só modificar/ler. Veja: PS C:\Scripts> echo ${c:\scripts\teste.ps1} ls | fl PS C:\Scripts> ${c:\scripts\teste.ps1} = 'ls -Recursive | fl' PS C:\Scripts> echo ${c:\scripts\teste.ps1} ls -Recursive | fl PS C:\Scripts> cat teste.ps1 ls -Recursive | fl Fantástico, não? Você consegue ler o arquivo simplesmente lendo uma variável chamada ${caminho_completo_do_arquivo}. Vale fazer qualquer coisa... adicionar linhas usando +=, colocar em variáveis, fazer loops, pegar uma linha específica usando [posicao], etc. Simples e direto, como a maioria das coisas no Powershell. []s, Vinicius

Categorias dessa postagem:

Lee Holmes: Sobre a lógica dos nomes e dos comandos no Powershell

http://www.leeholmes.com/blog/WritingPowerShellCmdletsVsWritingPowerShellProviders.aspx Enconstrei no blog do Lee Holmes um post muito bom sobre como foram criados os comandos no Powershell. Recomendo ler. Fica mais fácil entender... Por sinal, o livro que comentei tempos atrás eu consegui. Ele me mandou, continuo lendo e comento aqui quando terminar. []s, -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog sobre Scripting: http://viniciuscanto.blogspot.com

Categorias dessa postagem: ,

Como desabilitar o aviso de segurança do Windows XP para arquivos baixados da Internet

Mais um post rápido: Descobri como desabilitar o aviso de segurança do XP SP2 (ou seria SP1?) durante a execução de um script neste artigo. O problema é interessante... imagine que um dos seus scripts precisa fazer o download de um programa e em seguida, executá-lo. O XP interrompe o script e mostra uma mensagem perguntando se você quer realmente fazer isso, uma vez que o editor não foi localizado e este é um arquivo "potencialmente perigoso". Daí você dá um Ok e tudo continua... Parece babaca, mas se você tiver um script que faz vários downloads (eu tenho um que faz vários deles), você vai ter que dar Ok em todos, o que torna o trabalho extremamente chato. Pra resolver isso, você só precisa setar uma variável de ambiente que desabilita a checagem: Em VBScript:

set oShell= CreateObject("Wscript.Shell")
set oEnv = oShell.Environment("PROCESS")
oEnv("SEE_MASK_NOZONECHECKS") = 1
Pronto, agora tudo funciona novamente! []s, Vinicius Canto

Categorias dessa postagem: , , ,

Problema com UTF-8 e o Windows Script Host

Olá, mais um post rápido, coisa de quem tá sempre sem tempo: Existe um problema relacionado ao uso de scripts codificados em UTF-8 no Windows Script Host. O problema é que simplesmente não funciona. Percebi isso quando resolvi criar scripts dentro de um editor de textos que uso, que fica sempre programado para criar arquivos em UTF-8. Tudo que eu fazia nele dava erro na linha 1, caractere 1. Como resolver? Salve com codificação ANSI. No bloco de notas, é só usar o Salvar Como... e marcar ANSI na lista que aparece na parte de baixo da janela. []s, Vinicius

Categorias dessa postagem: , ,

Link para os scripts de hoje

Olá, post rápido: pra quem for acompanhar o Webcast de hoje sobre sistema de arquivos, e não conseguiu encontrar o link para download dos arquivos que foram usados, segue abaixo: www.technetbrasil.com.br/downloads/webcasts/scriptmania2.zip Obrigado pessoal, -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog sobre Scripting: http://viniciuscanto.blogspot.com

Categorias dessa postagem:

Erro na documentação do MSDN sobre VBScript

Olá, qual foi a minha surpresa ao ver um erro em um arquivo .CHM que eu tenho, a documentação do Windows Script Host. Todo mundo vive falando que há erros em documentação, mas eu nunca tinha achado um. Só na documentação do Oracle, mas foi em sala de aula e a professora que avisou. O erro era relativamente simples. Fazendo uma apresentação hoje, encontrei na página que falava sobre o objeto Folder do FSO uma parte que falava que ele tinha o método OpenAsTextStream, usado para abrir arquivos texto. Como vocês já devem estar imaginando, não faz sentido mesmo. Não existe esse método neste objeto e nem teria porque existir... abrir qual arquivo dentro da pasta? Segue a foto do que eu vi Esse arquivo que eu tenho é bem antigo. De 99 ou 2000 se não me engano. Uso ainda por ser absurdamente mais rápido abrir um CHM do que abrir uma página na Web. Pra me certificar, resolvi acessar a versão online dele pra ver se ainda tinha o erro... e felizmente, ele já foi corrigido. Tudo em paz pra apresentação de terça. Espero que gostem. []s, Vinicius

Categorias dessa postagem: ,

Webcast sobre scripting no Microsoft Technet Brasil

Olá, Depois de algum tempo sem postar, encontrei tempo para escrever aqui. A novidade é interessante: no site do Technet Brasil estão acontecendo Webcasts todas as terças-feiras sobre scripting. E o melhor: eu estou ministrando eles... Espero que gostem! [], Vinicius Canto

Categorias dessa postagem: ,

Como mudar a localização da pasta de armazenamento do Outlook Express: o dilema do Store Root e do CLSID usando scripts

ATUALIZADO: no final do artigo, coloquei mais dicas nos comentários... se não aparecer normalmente, clique em Comentários e veja o restante.

 

Hi,


hoje, me deparei com uma dúvida que eu tinha há muito tempo atrás, aos meus 15 ou 16 anos, quando comecei a fazer scripts pra Windows. Descobri, naquela época, que era possível alterar o local do Store Root do Outlook Express (ou Pasta de Armazenamento, na versão em português).

Essa pasta, que é o lugar onde o Outlook Express salva seus emails, tem uma peculiaridade interessante: ela não pode ser alterada para um local na rede... o que impede que você armazene seus emails em uma pasta mapeada na rede. Isso é metade da história verdadeira. Naquela época ainda, consegui descobrir que essa limitação só existia na interface gráfica; qualquer usuário com um pouco mais de experiência poderia mudar isso diretamente no registro e burlar a limitação sem problema algum. Cheguei a testar, com sucesso, no último lugar que trabalhei.

Entusiasmado com a descoberta, quis fazer um script pra automatizar isso. O problema que eu encontrei foi como localizar a chave no registro... uma vez que ela era gerada automaticamente pelo Outlook Express, e mudava de máquina pra máquina.

A chave onde fica o valor alterado é essa:

Chave: HKEY_CURRENT_USER\Identities\{CEF31BE5-846A-41AB-BCEB-02112D0D6A21}\Software\Microsoft\Outlook Express\5.0
Valor: Store Root (tipo String)


O problema estava aí... essa string entre chaves gigante é o CLSID, string que o OE gera para cada uma das identidades configuradas.

Na maioria das vezes, os usuários só usam uma, e aí o problema fica fácil de resolver. Tudo que eu precisei foi de alguém pra me lembrar desse problema (obrigado Luciano!) e de 10 minutos com o Vim e o Regedit abertos. Encontrei uma chave, HKCU\Identities e dois valores, Default User ID e Last User ID, que continham os IDs das identidades usadas recentemente. Aí, construir o script virou uma brincadeira. Vejam como ficou o produto final:

' Change-OE-Store.vbs
' bv Vinicius Canto
' MVP Visual Developer - Scripting
' Ciencias da Computação - USP São Carlos / Computer Science - University of São Paulo USP
' 19/10/2006


' Descomente a linha abaixo e comente a outra para tornar o script automático
' strPath = "z:\Mail"
strPath = inputbox("Digite o novo caminho do Store Root " & vbcrlf & "(note que precisa terminar com uma barra \)")

set objShell = CreateObject("Wscript.Shell")
strCLSID = objShell.RegRead("HKCU\Identities\Default User ID")
objShell.RegWrite "HKCU\Identities\" & strCLSID & "\Software\Microsoft\Outlook Express\5.0\Store Root",strPath,"REG_SZ"


Basta salvar com extensão .VBS e executar. Se preferir torná-lo um pouco mais automático, a ponto de poder ser colocado em um script de logon, basta comentar uma das linhas e descomentar a outra, como está escrito no próprio corpo do script.

Meus próximos passos: publicar no fórum, em resposta ao Luciano, mandar pro ScriptCenter e mandar uma sugestão pra Microsoft, uma vez que o artigo do KB 240659 está meio errado.


Bom, espero ter ajudado,



Vinicius

PS: O link pra dúvida original que motivou a criação do script está aqui.

Categorias dessa postagem:

Como mudar a fonte do console para Consolas ou qualquer outra fonte TrueType: COMMAND.COM, CMD.EXE e Powershell

Recentemente, no blog oficial do Windows Powershell, li um post que ensinava como trocar a lendária fonte Lucida Console (que é padrão desde o Windows 2000, se não me engano) por outra qualquer, desde que seja monoespaçada. O truque está aqui. Nada mais é do que uma pequena alteração no Registro, na chave HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont Tudo que você precisa fazer é adicionar um valor novo, cujo nome tem um código... é igual ao número de zeros que existe no maior valor até então + um zero. Ou seja... na maioria dos computadores só existe a fonte Lucida Console instalada para o console... com um valor de nome "0" igual à "Lucida Console". Tudo que você precisa fazer é criar mais um valor, com nome "00" e com um dado tipo string "Consolas" ou qualquer outra fonte TrueType monoespaçada (Courier New ou Andale Mono, por exemplo). Muito útil... no site original tem um script para Powershell que faz todo o trabalho sujo, você só precisa estar logado como Administrador (uma vez que para escrever nesta chave, é necessário ser admin local). Segue o Script $key = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" ## Find out if Consolas is installed on the system if(!(test-path (join-path $env:windir "Fonts\CONSOLA.TTF"))) { write-host "The Consolas font is not installed on the system." write-host "Install Microsoft Office 2007 Beta to obtain the font." break } ## Determine if Consolas is already installed as a command window font $installed = get-itemproperty $key | get-member | where-object { $_.Name -match "^0+$" } | where-object { $_.Definition -match "Consolas" } if($installed -ne $null) { write-host "The Consolas font is already installed as a command window font." break } ## Find out what the largest string of zeros is $zeros = (get-itemproperty $key | get-member | where-object { $_.Name -match "^0+$" } | measure-object).Count ## Install the font new-itemproperty $key -Name ("0" * ($zeros + 1)) -Type string -Value "Consolas" write-host "Consolas font installed successfully as a command window font." Só uns detalhes que eu percebi: 1 - No site oficial do Powershell, ele diz que é preciso reiniciar o computador (XP) ou efetuar Logoff (Vista). Aqui em casa, não precisei de nada disso. Bastou fechar o Powershell e abrir novamente 2 - Mais detalhes no KB 247815 É isso aí... aproveitem!

Categorias dessa postagem: ,

Horário de Verão 2006-2007. Veja como configurar o Windows XP, 2000 e 2003 automaticamente

Vejam o que eu mandei na MCPdx hoje. É bem útil... está em desenvolvimento ainda, mas quem quiser testar, fique à vontade. -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog sobre Scripting: http://viniciuscanto.blogspot.com ================================================== Olá pessoal, como prometido, fiz um script especificamente para alterar o horário de verão no Windows, para o que foi determinado para esse ano. O script está abaixo, precisa somente ser salvo em um arquivo com extensão .VBS e ser executado. É para funcionar em Windows Me, 2000, XP e 2003, todos em português. Gostaria de pedir aos interessados no script que testem em uma máquina-cobaia. Com o feedback de vocês poderei fazer outras versões (Powershell e Ruby, por exemplo) e colocar algumas funcionalidades (alguma interface com o usuário, suporte a várias máquinas, execução remota com WMI, etc). Nenhum tratamento de erros foi feito, tá quentinho, acabou de sair do forno. Vou mexer ainda e prometo que faço várias versões finais até o início do Horário de Verão, publico aqui, no site, no meu blog, no ITCentral, no Technet... onde puder. Para executar localmente, basta clicar duas vezes no script ou digitar cscript num console qualquer. Para aplicar em máquinas remotas, basta trocar o "." que existe nas primeiras linhas por "nome_da_maquina". Você precisará ter o WMI rodando na outra máquina da rede (por padrão, vem habilitado) e com regras no Firewall (da máquina e da rede) permitindo as conexões de entrada que o WMI faz (depois do SP2, fica tudo fechado por padrão, mas tem fácil na Net como resolver isso). Ah, só gostaria de pedir um favor. É necessário estar logado com uma conta administrativa para conseguir executar o Script. O que eu não recomendo é colocar ele como script de logon, com a ajuda de algum "truque" para dar credenciais administrativas para usuários comuns. Não é nem um pouco seguro fazer isso, existem N outras formas de se aplicar isso em várias máquinas. Segue o código. É gratuito, mas caso modifiquem para algum outro fim, gostaria que permanecesse ao menos uma referência ao conteúdo original. Bom, na versão final vai ter uma licensa CC bem tranquila. ' ============================================================================== ' Adaptado de um script obtido no Technet ScriptCenter em ' http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0224.mspx ' ' by Vinicius Canto ' Blog sobre Scripting: http://viniciuscanto.blogspot.com ' Coluna no Technet Brasil: http://www.microsoft.com/brasil/technet/colunas/Default.mspx ' Coluna no ITCentral: http://www.itcentral.com.br/default.asp?id=22&mnu=22 ' MCPdx: http://www.culminisconnections.com/sites/MCPDx/default.aspx ' ' Copyright (c) 2006 - Vinicius Canto Const HKEY_CURRENT_USER = &H80000002 strComputer = "." Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Time Zones\Hora Oficial do Brasil" strValueName = "TZI" arrValues=Array(&Hb4,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&Hc4,&Hff,&Hff,&Hff,&H00,&H00,&H02,&H00,&H00,&H00,&H04,&H00,&H02,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H00,&H0b,&H00,&H00,&H00,&H01,&H00,&H02,&H00,&H00,&H00,&H00,&H00,&H00,&H00) errReturn = objRegistry.SetBinaryValue(HKEY_CURRENT_USER, strKeyPath, strValueName, arrValues)

Categorias dessa postagem:

Powershell RC2: O que mudou desde o RC1?

Olá, continuando a escrever sobre o Powershell. Agora, sobre o que mudou especificamente desde a última versão pública, o RC1. Pra começar, vamos ao que significa RC. RC = Release Candidate, uma versão candidata a ser a versão final. Em termos práticos, é uma versão final... a não ser que alguém encontre um bug. O produto em questão está com o código completo, todas as funcionalidades implementadas. Nada de novo será feito, nenhuma alteração estrutural, apenas correção de bugs. A fonte disso está aqui: Wikipedia. Ao meu ver, ocorreram sim algumas mudanças importantes do RC1 pro RC2. Talvez não fosse tão necessário chamar de RC, mas já é uma versão bem perto da versão final. Vejamos quais mudanças foram essas que eu encontrei. Ngen e código nativo do Powershell Aparentemente, o bug que eu encontrei e comentei no NG oficial do Powershell não foi corrigido. Ou então minha máquina está tão devagar que está se comportando de forma absurdamente estranha (não acredito nisso, mas vamos lá). Aqui, o Powershell demora cerca de uns 7 ou 8 segundos para abrir pela primeira vez desde a última inicialização. Com as informações do NG, usei o utilitário Ngen e resolvi o problema com o RC1. Tentei o mesmo nas dlls do RC2, mas não adiantou. Vou perguntar denovo lá. Cores! Mais propriedades do objeto $host podem ser alteradas. Um bom exemplo disso é a propriedade $host.privatedata, que permite configurar algumas coisas legais como cores pras mensagens de erro, debug, etc. Outras como a $host.RawUI.BackgroundColor e ForegroundColor já podiam ser alteradas se não me engano... lembrei delas porque agora a cor padrão do Powershell é um fundo azul com letras brancas. Quantificadores Agora algumas coisas como KB, MB e GB são válidas no Powershell como quantificadores. Se não me engano, isso já existia em outra linguagem que eu gosto bastante, Ruby. O exemplo abaixo demonstra como é útil: ls | where {$_.lenght -ge 500kb } Mais operadores: -xor e -bxor Essa vai pra quem entende um pouco mais de lógica, operadores e base 2. Foram criados mais dois operadores, o -xor e o -bxor, que é igual ao primeiro, mas operando bit a bit. Veja: PS C:\> 10 -xor 5 False PS C:\> 10 -bxor 5 15 Local de Instalação Agora não podemos mais escolher o local da instalação, e ele fica em C:\Windows\System32\WindowsPowershell. O arquivo .ADM de configuração do nível de segurança padrão dos scripts agora não vem mais por padrão com o Powershell, mas poderá ser baixado separadamente na Web. Sinceramente, não entendi o porque dessas duas mudanças. Pra mim, só atrapalham. Parece mais coisa daquele Windows Genuine Advantage Autocomplete e Intellisense Não sei se a tecnologia é a mesma do Intellisense, do Visual Studio... mas agora o Autocomplete no console melhorou bastante. Você pode usar o TAB agora pra N coisas a mais. Antes servia pra completar caminhos, nomes de arquivo e pastas. Agora, serve para propriedades e métodos dos objetos, além de parâmetros de comandos. Veja: ls - ==> ls -Path ==> ls -Filter $a = ls $. ==> $a.Count get-process | foreach { $_. ==> get-process | foreach { $_.Clone( Fantástico e muito bom pra quem tá aprendendo. Ah, Shift + TAB também funciona. Faz a mesma coisa, mas na ordem inversa. Só ficou uma sugestão no ar... o Autocomplete podia funcionar igual ao do Bash... listando as oções abaixo da linha de comando, não usando ela mesma. Depois de algum tempo acostuma, mas seria legal copiar mesmo porque é absurdamente prático. Tá muito bom do jeito que tá, não conheço nada parecido em termos de shell, mas poderia ficar ótimo se seguissem minha sugestão. Bom, pra quem se interessar, recomendo ler o Getting Started e o Release Notes do Powershell. Tirei boa parte de lá e do que eu testei até agora. Pra quem não testou ainda, recomendo mais uma vez que teste, aprenda o mais rápido possível. esse é o futuro dos scripts. Posto mais novidades depois, ainda não acabou não! Obrigado, Vinicius

Categorias dessa postagem:

Powershell Quick Reference

Hi all, saiu esses dias no blog do Lee Holmes uma publicação dele na O'Reilly. Trata-se de um guia de referência em PDF sobre o Powershell. Creio que seja útil para quem tá começando. Vou tentar entrar em contato com ele e ver se consigo uma cópia para avaliar, ou mesmo adquirir uma pela O'Reilly mesmo. Tempos atrás li um outro livro muito bom sobre o Powershell, chamado "Monad". Se não me engano, foi o primeiro livro sobre o shell (tanto que o nome é o nome do livro é o antigo nome do Windows Powershell) ... mas o conteúdo é muito bom, mesmo pra quem não conhece muita coisa sobre scripting, com vários exemplos práticos. Recebi uma cópia para escrever um review, li, gostei e escrevi. Daí mandei de volta para um grande amigo meu, o Airton Leal (MVP também) e ele publicou no site da editora. Bom, se quiserem conselhos sobre bons livros pra aprender, recomendo esses. O primeiro eu li inteiro e sei exatamente do que se trata. O segundo me parece muito bom também, por ser objetivo, pequeno e relativamente barato. Se conseguir uma cópia para avaliar, depois conto como foi minha experiência com o "brinquedo". Até daqui a pouco... tô animado para postar hoje.

Categorias dessa postagem: ,

Powershell 1.0 RC2: Como baixar para o Windows 2003

Olá, Foi liberado ontem, dia 26, o RC2 do Powershell. O problema é que conseguir um link para baixar tá muito difícil... os do Scriptcenter na Microsoft estão quebrados. Aliás, perdi uns 10 minutos entre links quebrados e links errados no site da MS... talvez vocês possam ver aqui: http://support.microsoft.com/kb/925228 Depois de muito buscar (http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=powershell%20RC2&DisplayLang=en) encontrei um link válido para o meu Windows Server 2003 SP1. Podem baixar por aqui que é seguro: http://www.microsoft.com/downloads/info.aspx?na=22&p=10&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=&u=%2fdownloads%2fdetails.aspx%3fFamilyID%3dac12834a-5577-413b-9c39-54fb7f4b892e%26DisplayLang%3den Há também versões pro XP no primeiro dos links que eu passei. Após a instalação, algumas surpresas (que devem estar no changelog, mas como eu não li... dancei né?): - O arquivo profile.ps1 não foi carregado - O problema dele ser meio lento, o bug que eu encontrei no NGEN aparentemente não foi resolvido. Preciso reiniciar meu menino pra saber se o que eu fiz agora vai realmente dar diferença no boot do Powershell - O fundo da tela agora é azul! - O logo da criança mudou... e tá muito, mas muito mais legal. Vai pro novo design do blog. Bom, é isso. Mais tarde posto alguma coisa útil sobre ele.

Categorias dessa postagem:

Semana da Computação

O blog parou? Vinicius desistiu da árdua tarefa de manter um blog atualizado? A reposta é não. E o motivo pelo qual eu ando sumido de todas as formas de comunicação online (leia-se blogs, fóruns, newsgroups, MSN e tudo mais) é a organização da IX Semana da Computação do ICMC - Semcomp 9.0. Sou o presidente da comissão organizadora e estamos trabalhando desde Março deste ano. Como agora estamos perto do evento, os problemas precisam ser resolvidos rápido e isso toma boa parte do meu tempo hábil. Pra quem quiser ver o sucesso que o evento está sendo, acesse http://www.icmc.usp.br/semcomp. Em menos de 48 horas depois de abrir as inscrições, as 300 vagas já haviam se esgotado. Bom, não? Espero que compreendam minha ausência... Obrigado, Vinicius

Categorias dessa postagem:

Porque você não precisa usar a conta de administrador o tempo inteiro nem deixar seus usuários usando os computadores dessa forma

Parece que é o maior título de post que eu já fiz... mas a idéia é essa mesmo. Postei isso no fórum da Microsoft, tentando conscientizar o povo de que não é nada recomendado usar o computador desta forma e existe sim forma de contornar o problema daqueles sisteminhas que você usa na empresa que teimam em pedir credenciais administrativas pra funcionar. Segue o artigo, na íntegra: " Parece que eu tô começando a ficar chato batendo na mesma tecla, mas existem N formas de se adaptar um ambiente pra que nenhum usuário fora os da administração dos rede/computadores precise ter senha de admin. 1) Pra ambientes de desenvolvimento, não é necessário fazer nada, na maioria das linguagens... todas as IDEs mais moderninhas não precisam disso. Pros programadores que usam o recurso de Debug das IDEs, basta colocar eles num grupo especial chamado Debugger Users, que é criado automagicamente quando você instala um Visual Studio, por exemplo. 2) Tá, você vai me dizer então que as pessoas precisam instalar os programas pra testar na pele como funciona. Isso é desnecessário. Já ví livros de Engenharia de Software que condenam isso... porque quando o software é testado num ambiente assim, as chances de vc achar uma falha são pequenas... pois tudo que o software "precisar fazer" ele vai conseguir por estar sendo executado como admin. 3) Testes podem ser feitos em máquinas virtuais. A MS *dá de graça* o Virtual PC e o Virtual Server pra instalar coisas neles e testar à vontade. É de graça mesmo. E testar usando VPC vale mais a pena por dois motivos: 1 - vc pode criar ambientes reais, com 98, ME, XP, com qualquer tipo de usuário. 2 - testar o soft que vc fabrica em contas limitadas é uma garantia a mais que vc não vai ter falhas no soft e não vai mais forçar que admins usem contas de admins nas suas redes desnecessáriamente. 3) Essa é a filosofia do Unix há alguns anos... porque não usar no Windows? 4) Pras aplicações mais chatas que vcs usem, existe o ACT - Application Compatibility Toolkit, que permite criar configurações de ambiente pra que os softwares "achem" que estão tendo direitos de admin quando na verdade não o tem. Isso é usado em ambientes grandinhos, como bancos, por exemplo. A ferramenta, mais uma vez, é gratuita. 5) Contas limitadas não instalam software. Logo, dificilmente instalarão vírus... somente worms que ficam residentes na memória. Isso acontece porque usuários comuns não tem direito de mexer em nada fora do C:\Documents and Settings\%username% e fora de chave HKCU no registro, e portanto, o máximo que ele pode fazer é acabar com as configurações do perfil dele. Se der problema, é só remover o perfil e criar novamente... nada de formatação e máquinas lentas por causa de vírus e spywares. 6) Se as contas de admin tiverem senhas iguais nas máquinas, possivelmente uma máquina contaminada por um vírus VAI conseguir acesso à outra por compartilhamento administrativo (\\computador2\C$\) e por registro remoto. Isso facilita bastante a propagação de um vírus na rede. 7) Nem mesmo o dono da empresa deve ter conta de admin. Ele é administrador da empresa, não dos computadores, e provavelmente não conhece muito a fundo coisas como segurança. O mesmo vale pra você, administrador, na sua casa. Não use a conta de admin, mesmo que você seja o único usuário do seu computador em casa. Crie duas contas, use a comum. A de admin só pra instalar softwares. 8) Redes seguras funcionam assim. Posso citar como exemplo a do ICMC, na USP São Carlos. Em nenhum laboratório de graduação as pessoas usam contas de admin. Além disso, aqui as pessoas aprendem a programar... são quase todos programadores em duas ou mais linguagens, e nenhum problema é reportado. 9) Tem um site na MS que comprova isso tudo que eu to falando. O link é aquele que eu mandei, o blog do Aaron Margosis: Aaron Margosis' WebLog 10) Se nada disso funcionar, você ainda tem uma medida drástica: procure saber o porque que o software em questão precisa da conta administrativa. Você pode fazer isso usando dois softwares (gratuitos, claro) chamados regmon e filemon, pra monitorar o sistema de arquivos e o registro. Com eles você vê exatamente qual pasta e qual chave do registro o software tá acessando, e pode abrir eles no registro. Se forem várias máquinas, vale a pena criar um script. Não é a melhor solução, mas funciona em situações que não oferecem tanto risco. Há também a opção de usar o comando RUNAS com o parâmetro /savecred, para salvar as credenciais do admin para executar somente aquele programa. Também não é a melhor saída, deve ser usado com cautela. Isso por si só resolve 80% dos casos de mau uso dos computadores na rede, e é o procedimento recomendado da Microsoft. Afinal de contas, é ela quem cria o sistema, e sabe como usar ele da melhor forma. " Bom, reflitam sobre isso... e perguntem caso tenham dúvidas. Vale a pena, pode acreditar

Tags: windows powershell scripting

Categorias dessa postagem:

Powershell: como aumentar a velocidade dele?

Olá, depois de alguns dias sem postar nada, resolvi postar algo que, embora tenha aparecido no NG há um certo tempo, duvido muito que exista na Internet e que alguém tenha escrito algo a respeito. O problema gira em torno do Windows Powershell, o futuro prompt de comando dos sistemas Microsoft. Ora quem ainda não conhece, veja um primeiro link. Pra quem conhece e ainda não baixou nem testou, outro link. O grande detalhe é que o Powershell ainda é RC 1, ainda não saiu uma versão final. Aliás, segundo algumas mensagens postadas no grupo microsoft.public.windows.powershell, algumas mudanças ainda serão feitas até a versão final. Por ser RC 1, a atual compilação não leva em conta todas as opções de otimização, tornando ele um pouco mais lento. Só pra se ter uma idéia, em um Pentium 4 1.8 Ghz Northwood, o Powershell demora cerca de 6 segundos para abrir. Isso, ao menos pra mim, é inaceitável se tratando de uma ferramenta que administradores vão abrir várias e várias vezes durante um dia... A saída, é simples. Usar um softwarezinho chamado Ngen, que gera o código nativo para o hardware da sua máquina. Basta digitar o código abaixo, no próprio Powershell. set-alias ngen C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ngen.exe ls $pshome/*.dll | %{ngen install $_.fullname } A thread inteira, com várias explicações e dicas de MVPs e funcionários MS, você pode encontrar aqui. O ganho de performance é considerável, ao menos nesta versão. Aqui, o tempo de inicialização do Powershell baixou pra 3 segundos na primeira vez e pra menos de 1 segundo caso o powershell já tenha sido aberto uma vez desde que o micro foi ligado. []s, -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog sobre Scripting: http://viniciuscanto.blogspot.com PS: Não estou colocando os links diretamente mais por causa de um problema que ocorre no Internet Explorer... ele estica um DIV do layout da página de forma errada, e o site fica feio.

Tags: windows powershell scripting

Categorias dessa postagem:

É possível usar VBScript + .NET Framework?

Postagem rápida: encontrei por acaso a resposta pra uma coisa que eu não sabia fazer, procurei um tempo atrás e não encontrei... como usar uma classe do .NET Framework em scriptzinhos simples, do Windows Script Host... http://www.microsoft.com/technet/scriptcenter/csc/scripts/scripts/writing/cscst056.mspx A idéia é bem simples... é só colocar o nome completo da classe dentro de um CreateObject... como na linha abaixo: Set DataList = CreateObject("System.Collections.ArrayList") e usar... DataList.Sort() Enjoy! em breve faço mais brinquedos usando VBScript + .NET + Redes...

Tags: windows powershell scripting

Categorias dessa postagem:

Gerenciamento do USB: controlando escrita e tornando o USB read-only

Olá, depois de ver algumas dúvidas interessantes, separei esta pra comentar no blog. Ela foi feita por Cesar Macari, mas só tive tempo de responder hoje... a pergunta é: Como impedir a gravação de dados em drives USB, como pen drives, hds removíveis, câmeras, etc.? Assim como o "brinquedinho" que eu criei para monitorar o USB, esta daqui também é bem simples. Basta alterar uma chave no registro. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\WriteProtect 0: Habilita a gravação 1: Impede a gravação Você pode fazer isso com das seguintes formas: Arquivo .VBS Set objSh = CreateObject("Wscript.Shell") objSh.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\WritePolicy",1,"REG_DWORD" Arquivo .REG Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies] "WriteProtect"=dword:00000001 Linha de Comando no Powershell Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies -name WritePolicy -value 1 GPO http://www.petri.co.il/disable_writing_to_usb_disks_in_xp_sp2_with_gpo.htm Fonte: http://www.petri.co.il/disable_writing_to_usb_disks_in_xp_sp2.htm

Categorias dessa postagem:

Powershell, vírus e o worm MSH/Cibyz

http://news.com.com/Hackers+try+to+crack+Windows+PowerShell/2100-1002_3-6101106.html Essa foi a notícia do dia, segundo o serviço de alertas do Google. Mas não pra todo mundo... só pra mim, que programei ele pra ficar fazendo buscas por tudo que for relacionado à string "Powershell". E como isso saiu na imprensa, por aí, ele me avisou prontamente... Eu, como MVP em Scripting e conhecedor de um pouquinho de Powershell, me senti na obrigação de esclarecer que, mais uma vez, a imprensa e os sites que noticiaram o fato dessa maneira, erraram. E erraram por desconhecer a ferramenta e computação como um todo. O fato é que, pelo que eu vi, o Powershell com as configurações padrão é imune. O vírus vem via Kazaa, disfarçado com nomes comuns. O usuário baixa pensando se tratar de outra coisa e executa... a partir daí, o vírus, como qualquer outro script, passa a ter controle do micro para poder fazer coisas como sobrescrever arquivos com determinada extensão, alterar a barra de título do Internet Explorer e tudo mais. Só tem alguns detalhes que usuários comuns e repórteres desinformados não conhecem:

  • Os scripts do Powershell não vão ser executados por padrão quando houver um clique duplo em cima do ícone deles. Ao invés disso, o bloco de notas irá mostrar o código. Obviamente, esse comportamento pode ser alterado por um usuário mais experiente.
  • O Powershell também não executará scripts não assinados de fontes desconhecidas. E das conhecidas, ele vai pedir uma confirmação antes. Mais uma vez, esse é o comportamento padrão, mas pode ser alterado também.
  • Tudo que o "virus" faz pode ser feito com qualquer outro script, não precisava nem ser Powershell. Usando o Windows Script Host fica até mais bonitinho. Não há nenhuma técnica nova, e o script não explora nenhuma falha do Powershell. Logo, o "proof-of-concept" que colocaram em vários lugares é, no mínimo, engraçado. Tudo que ele faz é alterar o sistema e criar cópias dele com nomes engraçados na pasta de compartilhamento do Kazaa. Alterar arquivos e criar cópias deles se aprende nas primeiras aulas de qualquer cursinho de informática.
A propósito, eu gostaria de receber o código desse "vírus", por curiosidade mesmo. Talvez eu consiga fazer algumas outras versões dele em C, C++, Ruby e qualquer outra linguagem... Mais detalhes do pseudovirus aqui. E não fui só eu quem achou o "vírus" uma piada. Tem mais gente aqui e aqui. Bom, é isso. E se você tiver o código dele, pode me enviar. Ficarei muito agradecido e publicarei aqui, criarei um artigo e tudo mais explicando como fazer aquelas "tarefas avançadas" no Powershell.

Categorias dessa postagem:

Resumo da participação em newsgroups

Navegando recentemente na net encontrei uma ferramenta interessante de um grupo de pesquisa da MS... o NetScan. O brinquedo permite buscar informações e resumos sobre grupos de notícias, neste caso, os da Microsoft. É interessante pra poder saber quantas mensagens você já enviou, quais newsgroups participou, quem participa, resumos dos grupos, etc... Aqui vai o meu resumo... nada mais é do que uma busca pelas mensagens enviadas a partir do meu segundo email, o scripterbr_at_gmail_dot_com. Segue também as estatísticas do grupo que eu mais participo, o microsoft.public.br.scripting Até a próxima... estou bolando um script interessante usando Powershell para baixar páginas, mesmo com cookies. []s, -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog: http://viniciuscanto.blogspot.com

Categorias dessa postagem:

Powershell pra quem tá entendendo um pouco mais...

Saiu no blog do Scott Hanselman um video sobre algumas coisinhas mais avançadas do Powershell. Algumas. Algo pra quem tá entre o básico e o intermediário no novo "brinquedo" na área de scripts. Abaixo, o link: http://www.wrox.com/WileyCDA/Section/id-292183.html Aliás, outro link interessante, no mesmo blog. Uma petição pra que continuem o desenvolvimento do VB6, COM e coisas do gênero. http://classicvb.org/petition/ Por mim, tanto faz. O .Net Framework é muito mais bem escrito, leva em conta vários aspectos da programação orientada a objetos... dá pra fazer coisas muito melhores. No entanto, VB6, COM e VBScript são extremamente legais pra se fazer coisas "fast and dirty". Ou seja, legal pra quando você precisa de um pequeno script, funcionalidade, programinha... pra ontem. E não faz diferença ser rápido, bem escrito ou qualquer coisa assim. Como eu entendo dos dois mundos, tanto faz... vale a visita ao blog do Scott. Muito bom, recomendo. -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog: http://viniciuscanto.blogspot.com

Categorias dessa postagem:

Configuração da rede: script ou não?

Olá a todos, depois de uma viagem pra SP, voltei descansado, pronto pra começar mais um semestre na faculdade. E vou começar por aqui também com um problema que me ocorreu agora pouco, no MSN, de um amigo meu, Josué Vidal.

O problema dele era relativamente simples. Preciso configurar a rede de várias máquinas. Modificar o DNS, por exemplo. Como fazer um script?

Como um administrador inteligente, aceitei a proposta de não fazer tudo na mão. O problema é: como fazer isso com scripts? Imediatamente, não existe solução com as poucas ferramentas do Windows Script Host (WSH). Com o WMI dá, mas já cansa só de pensar em qual classe isso ia ficar, e qual seria o método que eu ia poder utilizar. Isso sem contar no script que eu ia ter que montar, abrir um arquivo de texto, ler linha por linha e chamar a função que muda o DNS... é possível, mas ia tomar uns 5 minutos.

Quando se fala de configuração de rede, existe sempre uma saída mais fácil, que nem todo mundo lembra de usar. O Net Shell, ou netsh. É um comandinho simples que abre um shell (ou não, como vamos ver a seguir) pra configurar a rede da máquina. Basta digitar netsh em um console qualquer.

Pesquisando um pouco, você vai ver que, digitando nessa sequencia os comandos interface, ip, dns você pode ver e configurar o DNS de uma máquina. Pode também executar direto da linha de comando, digitando tudo de uma vez:

netsh interface ip set dns "Conexão local" static 200.176.2.10 primary

Ótimo, podemos colocar essa linha em um script, colocar no logon das máquinas e tá tudo pronto... certo? Não. Não só está errado como dá pra ficar melhor ainda. O problema está no fato que usuários comuns não podem alterar configurações de rede. A saída então é executar o comando remotamente*. O parâmetro -r do netsh serve exatamente para isso, veja:

netsh -r nome_do_computador interface ip set dns "Conexão local" static 200.176.2.10 primary

Pronto. Agora você pode criar seu script pra ler linha por linha de um arquivo texto e executar o comando acima para cada linha do arquivo. Se quiser, pode usar o Microsoft Powershell e resolver o problema de vez, com uma única linha:

cat lista.txt | foreach {netsh -r $_ interface ip set dns 'Conexão local' static 200.176.2.10 primary}

Agora sim, resolvido o problema.

Até a próxima!

* o WMI poderia resolver esse problema novamente. Bastaria criar um script que executa um comando remotamente... tem pronto no Technet ScriptCenter. Mas já que existe um parâmetro que serve para fazer a mesma coisa, porque não?

Categorias dessa postagem:

Indo para SP

Olá pessoal, embarco pra SP em 15 minutos. Não terei computadores por lá (mais pelas férias mesmo) e não postarei nada, nem no blog, nem nos fóruns, nem no NG, nem no MCPdx. Volto segunda (ou não) mais animado pra ajudar a galera... []s, -- Vinicius Canto MVP Visual Developer - Scripting MCP Windows 2000 Server, Windows XP e SQL Server 2000 Blog: http://viniciuscanto.blogspot.com

Categorias dessa postagem:

WQL Analyzer e uma correção

Hoje vou mostrar um "brinquedo" que eu achei agora pouco. É um "achado" pra quem trabalha com scripts, gerenciamento de redes, SMS, MOM, ou qualquer coisa que envolva WMI diretamente. Trata-se do WQL Analyzer. É uma espécie de SQL Analyzer, mas pra WQL, que é o subset do SQL pra consultas num repositório WMI. Segue o link: http://www.yogageneration.com/~mvkazit/demo/WQLAnalyzer/index.html Outra coisa importante: não sei se perceberam, mas faltou um underline no script que eu postei com o USB Monitor. Corrigi já. A falha foi no Ctrl + C e Ctrl + V no blogspot... Era perto da linha 27. Pra quem não sabe, o _ em VBScript permite que se continue um comando na linha de baixo, coisa que normalmente a linguagem não faz. []s, PS: não rodou aqui... alguém conseguiu fazer funcionar?

Categorias dessa postagem:

Aprendendo Jack Johnson nas férias

Aprendi a tocar mais duas músicas do Jack Johnson no violão: Sitting, Waiting, Wishing e Upside Down. São relativamente simples, o difícil é o ritmo no violão... É só me dar tempo que eu consigo aprender coisas novas. Detalhe: disse que aprendi. Só. Isso não implica em tocar bem, muito menos tocar violão igual ao próprio Jack Johnson... tô muito longe disso.

Categorias dessa postagem:

Powershell and SSH

Foi publicado no The Hive Archive um pseudo-tutorial (ou how-to, sei lá) sobre como trabalhar com o PowerShell a distância, usando SSH. Simplesmente fantástico... A idéia é muito boa, e vem pra complementar o Powershell Remoting, que estava sendo feito aqui. Ah, é claro. Se você não sabe o que é o Powershell, veja aqui, aqui ou aqui. Só pra adiantar, é um console que a Microsoft está desenvolvendo, pra substituir o velho COMMAND.COM e CMD.COM. A diferença é grande: é um shell orientado a objetos, feito em cima do .Net Framework. A linguagem que ele usa também é muito melhor do que as que eram usadas nesses dois interpretadores de comando que eu comentei e é possível fazer scripts muito bons com meia dúzia de linhas. Infelizmente, a versão atual ainda não conta com recursos que seriam úteis, como lavar roupa, fazer a comida, etc... Meus próximos posts terão algumas coisas em Powershell também... aliás, a tendencia é que eu passe a fazer tudo em Powershell com o tempo. Segue um script em uma linha que usei hoje: Problema: Executei um comando no console que criou vários arquivos dentro de uma pasta, todos com a string notice no meio, como em notice001.dat ou vvnoticekk.bak. Queria remover todos eles, na pasta atual e em subpastas. Solução, com Powershell: ls -R | where {$_.name -match 'notice' } | rm $_ Bom, é isso aí. Até mais!

Categorias dessa postagem:

How to monitor when user pugs a USB Storage Device

Aqui segue uma das minhas obras primas. Trata-se de um script (WSH + VBScript) que fica rodando em background, monitorando quando alguém insere um dispositivo de armazenamento USB. Quando o usuário insere o dispositivo, o sistema envia um email pro administrador.
Útil, não?

Basta salvar em um arquivo texto com extensão .VBS e rodar. Cuidado com as quebras de linha...

'USB Storage Monitor
'
'Vinicius Canto
'MVP Visual Developer - Scripting
'
'Grupo PET Computagco - Universidade de Sco Paulo - Brasil

'Disabling error messages...
On Error Resume Next


'Main routine
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE Targetinstance ISA 'Win32_PNPEntity' and TargetInstance.DeviceId like '%USBStor%'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Notifier(objLatestEvent.TargetInstance)
Loop

Sub Notifier(object)
Set objNet = CreateObject("Wscript.Network")

'You can change the function below to perform other actions
SendMailWithoutSSL _
"admin@network.com", _
"USB storage detected on " & objNet.Computername, _
"machine@network.com", _
"The user " & objNet.Username & " connected an USB Storage device on computer.", _
"smtp.network.com", _
25, _
"user", _
"pass"
End Sub




' CDOSYS official documentation:
' http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wss/wss/_cdo_queue_top.asp
'
' by Vinicius Canto
Sub SendMailWithoutSSL(strDestination, strTitle, strFrom, strMessage, strSMTP, intPort, strUsername, strPassword)
set oMessage = CreateObject("CDO.Message")
set oConf = CreateObject("CDO.Configuration")
Set oFields = oConf.Fields



oFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTP
oFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = intPort
oFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 'cdoBasic: Auth with user and password sent with plain text
oFields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = strUsername
oFields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPassword
oFields.Item("http://schemas.microsoft.com/cdo/configuration/Smtpusessl") = false
oFields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 '1: Using local SMTP; 2: Using port; 3: Using Exchange
oFields.Update

oMessage.Fields.Item("urn:schemas:mailheader:to") = strDestination
oMessage.Fields.Item("urn:schemas:mailheader:from") = strFrom
oMessage.Fields.Item("urn:schemas:mailheader:sender") = strFrom 'reply-to
oMessage.Fields.Item("urn:schemas:mailheader:subject")= strTitle
oMessage.Fields.Item("urn:schemas:mailheader:x-mailer") = "Vinicius Small Mail System -- by Vinicius Canto "
oMessage.Fields.Update

oMessage.Configuration = oConf

oMessage.TextBody = strMessage
oMessage.Send
End Sub

Esse daí eu fiz a pedido de um amigo meu, Sérgio Dias, MVP e Analista Consultor na área de Segurança da Informação. Aliás, aqui vai o link pro blog dele, que necessita urgentemente de uma atualização: =)
http://msmvps.com/blogs/sdias

O mais legal disso tudo é que não existe nada parecido no mundo ainda. Vou mandar pra tudo quanto é lugar agora... ScriptCenter, Knowledge Base, etc...

Aproveitem...!

Categorias dessa postagem: , , , ,

MVP Award

Olá! Voltei pra finalmente contar a novidade que eu prometi. Recebi, semana passada, a notícia que eu sou o mais novo MVP do Brasil, primeiro na categoria Visual Developer - Scripting. E isso me deixou feliz pra valer... tanto que criei esse blog pra contar um pouco mais do que eu faço. Pra quem não conhece, o MVP Award é um prêmio concedido pela Microsoft, em reconhecimento dos profissionais mais dedicados na tarefa de contribuir com comunidades de usuários. Ao contrário das certificações, para o programa MVP não existe nenhuma prova ou teste. O trabalho dos profissionais é analisado por uma comissão interna e o vencedor é escolhido dentre uma lista de candidatos. É o reconhecimento de um trabalho que eu faço desde cedo... comecei a contribuir em fóruns, grupos de notícias e listas de email quando tinha 12 anos, ainda com meu velho Cyrix MediaGXII 266Mhz e uma conexão discada que sincronizava o NG de madrugada. Hoje continuo da mesma forma, só mudei de lugar: contribui nos fóruns da Microsoft, além de ser um dos moderadores da lista de discussão MCPdx. Aqui vai a definição, segundo o próprio site da MS: "Os MVPs (Most Valuable Professionals) Microsoft são pessoas reconhecidas, confiáveis e acessíveis, que têm experiência em um ou mais produtos Microsoft e que participam ativamente de comunidades on-line e off-line com o intuito de compartilhar seu conhecimento e experiência com outros clientes Microsoft." Outra coisa interessante é que recebi um convite pra moderar um dos fóruns da Microsoft. Mas essa fica pro próximo post... Mais informações sobre o MVP Award: http://www.microsoft.com/brasil/mvp/overview.mspx

Categorias dessa postagem:

(Ctrl + Shift + Alt) + clicar em Cancelar

Aqui vai um atalho no mínimo curioso: clique em iniciar, desligar. Na tela que aparecer, segure as teclas Ctrl + Shift + Alt e clique no botão cancelar. Isso deve matar o shell (assumindo que vc usa o padrão, o famoso Explorer.exe).

Descobri isso por acaso lendo um artigo na net, em http://blogs.msdn.com/oldnewthing/archive/2004/10/28/249044.aspx. Não testei ainda porque não uso o explorer.exe, mas deve funcionar...

Ficou no ar a pergunta: pra que alguém iria inventar um atalho pra “matar” o shell? Pelo que li nos comentários do post, creio que deva ter sido por causa de programadores que desenvolvem extensões pro shell poderem reiniciar ele de uma forma mais rápida do que abrir o gerenciador de tarefas, achar o explorer e clicar em Finalizar Tarefa. Aliás, não lembro se nas versões 9x o Explorer aparecia no gerenciador de tarefas que aparecia no Ctrl + Alt + Del. Nesse caso, só o atalho iria resolver...

Um dia, com mais calma, escrevo alguma coisa sobre o shell que eu uso.

Categorias dessa postagem: