在 Windows 2012 R2 服务器上打开 RDS 会话时,我运行了一个 powershell 登录脚本。我还在启动文件夹中运行了一个 powershell 脚本。
- 在登录脚本中询问
CLIENTNAME
环境变量时,我得到了以前打开的会话客户端名称,而不是当前的。如果我在关闭前一个会话之前删除注册表HKCU\Environment\Clientname
属性,我只会在登录期间为 ClientName 获得一个空值。 - 在会话打开后启动的脚本中询问 ClientName 变量时,我得到了当前的客户端名称(如预期的那样)。
我有两个客户:
TestClient1
带 IP 地址10.100.20.201
TestClient2
带 IP 地址10.100.20.202
RDS 服务器是SRV-XA01
.
我还使用了一个名为gettscip.exe
获取客户端 IP 地址的小实用程序
我登录TestClient1
然后关闭会话。然后我从TestClient2
(日期为法语格式dd/mm/YYYY
)开始一个会话。
登录脚本:
29/12/2016 10:57:07 : --- SRV-XA01 新会话打开 ---
29/12/2016 10:57:07 : * 客户名称(来自 env:CLIENTNAME):
29/12/2016 10:57:10:* IP 地址:10.100.20.202
29/12/2016 10:57:11:* ClientName 来自 [Environment]::GetEnvironmentVariables("user").ClientName:TestClient1
29/12/2016 10:57 :11: --- 登录脚本成功结束!---
第二个脚本:
29/12/2016 10:57:25 : --- 会话打开后运行的脚本 ---
29/12/2016 10:57:25 : * 客户端名称(来自 env:CLIENTNAME):TestClient2
29/12/2016 10:57:25 : --- 脚本结束 ---
在登录脚本中env:CLIENTNAME
返回一个空值,[Environment]::GetEnvironmentVariables("user").ClientName
返回以前的客户端名称。登录后,一切正常。
我得到的 IP 地址是来自当前客户端的好地址。
那么为什么在登录脚本运行时 ClientName 环境变量没有更新呢?
编辑:脚本代码。
登录脚本:
$DomainName = "domain.fr"
# Nom de l'utilisateur
$UserName = $env:USERNAME
$ScriptsDir = "\\$DomainName\Scripts"
$LogDir = "$ScriptsDir\ScriptsXA7\Logs"
$global:LogFile = "$LogDir\$UserName.log"
Import-Module "$ScriptsDir\Systeme\Modules\Write-Log"
# Serveur Citrix
$ComputerName = $env:COMPUTERNAME
# Poste client
$ClientName = $env:CLIENTNAME
Write-Log "--- New Session opening on $ComputerName ---"
Write-Log "* Client Name (from env:CLIENTNAME) : $ClientName"
$IPExe = "$PSScriptRoot\IP\gettscip.exe"
# On lance l'exécutable qui va remonter l'adresse IP et on la stocke dans la variable `$ip`
$ip = Invoke-Expression $IPExe
$ip = $ip -replace "WTSClientAddress: ",""
# On place cette adresse IP dans la variable d'environnement `CLIENTIP`
[Environment]::SetEnvironmentVariable("CLIENTIP", $ip, "User")
Write-Log "* IP address : $ip"
Write-Log "* ClientName from [Environment]::GetEnvironmentVariables("user").ClientName : $([Environment]::GetEnvironmentVariables("user").ClientName)"
Write-Log "--- Logon script successfully ended ! ---"
第二个脚本:
$DomainName = "domain.fr"
# Nom de l'utilisateur
$UserName = $env:USERNAME
$ScriptsDir = "\\$DomainName\Scripts"
$LogDir = "$ScriptsDir\ScriptsXA7\Logs"
$global:LogFile = "$LogDir\$UserName.log"
Import-Module "$ScriptsDir\Systeme\Modules\Write-Log"
# Serveur Citrix
$ComputerName = $env:COMPUTERNAME
# Poste client
$ClientName = $env:CLIENTNAME
Write-Log "--- Script running after session is opened ---"
Write-Log "* Client Name (from env:CLIENTNAME) : $ClientName"
Write-Log "--- Script ended ---"
正如 Drifter104 所说,为了获得 的当前值
ClientName
,必须从HKCU:\Volatile Environment\<session id>
如果在http://www.out-web.net/?p=1479找到了两个小的 PS 功能。
要获取会话 ID:
要读取
ClientName
值:利用 :