Script de logoff do Windows para modificar o registro em HKCU

3

Estou tentando modificar entradas de registro no HKCU no logoff. O script correspondente funciona bem quando invocado manualmente. Eu estava com medo de haver problemas com o início de uma política de loopback, mas, de acordo com o rsop.msc, esse não é o caso, ou seja, o script deve ser executado. No entanto, o efeito desejado no registro não está presente no próximo login.

Existe um problema geral simplesmente porque o script é executado "tarde demais"? Se sim, o que pode ser feito? O que mais poderia ser isso?

EDITAR: Eu deveria ter especificado como meu script logoff.vbs se parece (minimalizado):

const HKCU = &H80000001

Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
' ...
oReg.SetStringValue HKCU,"SOFTWARE\Foo","Bar", "Baz"
    
por Hagen von Eitzen 26.02.2013 / 12:07

3 respostas

0

Houve realmente dois problemas.

Em primeiro lugar, na presença da política de loopback, deve-se ter cuidado com o rsop.msc, porque apenas usar o padrão (ou seja, assinalar "pular para a última página do assistente sem coletar mais dados" logo após selecionar recipientes do usuário e do computador) pode não refletem os verdadeiros resultados da política. É preciso, pelo menos, marcar loopback na segunda página (e substituir ou mesclar) para obter resultados realistas. Ter cuidado aqui ajuda a diagnosticar corretamente se o script for executado no logoff.

Em segundo lugar, SetStringValue cria valores se eles não existirem antes, mas não cria chaves inexistentes. Portanto,

oReg.CreateKey HKCU,"SOFTWARE\Foo"

deve ser emitido no script (para o registro, CreateKey faz criar chaves inexistentes recursivamente, mas é claro que "HKCU \ SOFTWARE" já existe).

    
por 01.03.2013 / 19:25
2

Eu uso Logoff Scripts com bastante frequência. O registro do usuário ainda é carregado quando o script é executado e as modificações podem ser feitas em seu registro. Scripts de logoff são executados de forma síncrona, por design. Eu tenho scripts de logoff que leem do registro do usuário, mas eu nunca tive a oportunidade de escrever. Mesmo assim, espero que funcione bem.

Eu peguei seu snippet de código acima, coloquei-o em um arquivo e o atribui como um Logoff Script na Diretiva de Grupo Local em uma VM do Windows XP SP3 e obtenho o resultado desejado. Eu defino HKCU\Software\Foo\Bar igual a xxx , desconectei, efetuei logon novamente e descobri que o valor foi alterado para Baz , conforme o esperado.

Eu acho que você está tendo algum outro tipo de problema, além da execução de scripts. Adicionei uma chamada MsgBox ao código para poder "ver" o código em execução no logoff. Adicionar o MsdBox não alterou o comportamento relacionado ao registro, mas me forneceu uma indicação visual de que o código estava em execução (e retido o logoff até que eu encerrei o diálogo).

(Eu posso ir em frente e testar no Windows 7 também, se você quiser, mas eu não antecipo nenhuma alteração na funcionalidade.)

    
por 01.03.2013 / 02:12
0

Eu imagino que você esteja usando reg.exe para modificar entradas de registro. O problema é que reg.exe é executado em um processo separado e o script de logoff apenas espera terminar. Portanto, é provável que a seção do Registro seja descarregada antes que a edição seja concluída.

Acho que você pode resolver o problema usando duas linhas do WScript, como no exemplo a seguir:

Set objShell = CreateObject("WScript.Shell")
objShell.Run "REG ADD HKCU\key ...",,true

O terceiro parâmetro de objShell.Run , chamado bWaitOnReturn , instrui o script a aguardar que o processo externo seja concluído antes de continuar a execução.

    
por 26.02.2013 / 12:49