Я пришел из Вот. Мой вопрос конкретно о получении обновлений переменных среды из другого сеанса. Если я обновляю системную переменную среды в одном пользовательском сеансе, я обнаружил, что другие сеансы должны выйти / войти, чтобы применить изменение. Но если я просто убегу SET
в других сеансах я вижу изменение. Но ни один новый процесс не внесет изменений.
Такое поведение задумано? Есть ли способ для других пользователей получить новую переменную среды без выхода из системы?
Существует вызов API системного уровня "SendMessageTimeout", который можно вызвать с помощью PInvok с помощью PowerShell:
Invoke-WMSettingsChange
http://poshcode.org/2049
Описание: уведомляет другие процессы об изменении глобального блока среды. Это позволяет другим процессам вносить изменения в ENV: без перезагрузки или выхода из системы / входа в систему. Ненулевой результат SendMessageTimeout указывает на успех.
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);
Больше информации: