Como a variável de ambiente de atualização muda de uma sessão de usuário diferente?

1

Eu vim de aqui . Minha pergunta é especificamente sobre como obter atualizações de variáveis de ambiente de uma sessão diferente. Se eu atualizar a variável de ambiente do sistema em uma sessão do usuário, descobri que as outras sessões devem efetuar logout / in para aplicar a alteração. Mas se eu executar apenas SET em outras sessões, posso ver a alteração. Mas qualquer novo processo não vai pegar a mudança.

Esse comportamento é por design? Existe uma maneira de outros usuários obterem a nova variável de ambiente sem fazer logoff?

    
por Kai Wang 22.11.2015 / 15:54

1 resposta

0

Há uma chamada de API no nível do sistema "SendMessageTimeout" que pode ser PInvoked usando o PowerShell:

Invoke-WMSettingsChange - link

Descrição: notifica outros processos que o bloco de ambiente global foi alterado. Isso permite que outros processos selecionem alterações em ENV: sem ter que reinicializar ou fazer logoff / logon. Um resultado diferente de zero de SendMessageTimeout indica sucesso.

if (-not ("win32.nativemethods" -as [type])) {
    # import sendmessagetimeout from win32
    add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"  

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
   IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
   uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
}

$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero

# notify all windows of environment block change
[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,
        [uintptr]::Zero, "Environment", 2, 5000, [ref]$result);

Mais informações:

link

    
por 22.11.2015 / 16:14