Windows 在Visual Basic 6中,Environ()函数为CLIENTNAME返回空值

Windows 在Visual Basic 6中,Environ()函数为CLIENTNAME返回空值,windows,vb6,environ,Windows,Vb6,Environ,我在Visual Basic 6中有一个遗留应用程序,它使用Environ()函数获取环境变量CLIENTNAME 该函数不返回任何值。但是,如果使用shell中的命令“SET CLIENTNAME”,则会得到正确的值 如果用户被授予管理员权限,Environ()工作正常,返回正确的值,这表明存在安全问题 如果您有任何建议,我将不胜感激。您可以使用API调用获取当前RDP会话客户端名称,如下所示 Option Explicit '--- for WTSQuerySessionInformati

我在Visual Basic 6中有一个遗留应用程序,它使用Environ()函数获取环境变量CLIENTNAME

该函数不返回任何值。但是,如果使用shell中的命令“SET CLIENTNAME”,则会得到正确的值

如果用户被授予管理员权限,Environ()工作正常,返回正确的值,这表明存在安全问题


如果您有任何建议,我将不胜感激。

您可以使用API调用获取当前RDP会话客户端名称,如下所示

Option Explicit

'--- for WTSQuerySessionInformation
Private Const WTS_CURRENT_SERVER_HANDLE             As Long = 0
Private Const WTS_CURRENT_SESSION                   As Long = -1
Private Const WTSClientName                         As Long = 10

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function WTSQuerySessionInformation Lib "wtsapi32" Alias "WTSQuerySessionInformationA" (ByVal hServer As Long, ByVal SessionId As Long, ByVal WtsInfoClass As Long, ppBuffer As Long, pBytesReturned As Long) As Long
Private Declare Sub WTSFreeMemory Lib "wtsapi32" (ByVal pMemory As Long)

Private Function GetSessionClientName() As String
    Dim lPtr            As Long
    Dim lSize           As Long

    Call WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientName, lPtr, lSize)
    If lPtr <> 0 Then
        GetSessionClientName = String$(lSize - 1, 0)
        Call CopyMemory(ByVal GetSessionClientName, ByVal lPtr, lSize - 1)
        Call WTSFreeMemory(lPtr)
    End If
End Function

Private Sub Form_Load()
    MsgBox "GetSessionClientName=[" & GetSessionClientName() & "]", vbExclamation
End Sub
选项显式
'---用于WTSQuerySessionInformation
私有常量WTS\u当前\u服务器\u句柄长度=0
Private Const WTS_当前_会话长度=-1
Private Const WTSClientName,长度=10
私有声明子CopyMemory Lib“kernel32”别名“rtlmovemory”(lpvDest为Any,lpvSource为Any,ByVal cbCopy为Long)
私有声明函数WTSQuerySessionInformation Lib“wtsapi32”别名“WTSQuerySessionInformation”(ByVal hServer为长,ByVal SessionId为长,ByVal WtsInfoClass为长,ppBuffer为长,pBytesReturned为长)为长
私有声明子WTSFreeMemory库“wtsapi32”(ByVal pMemory尽可能长)
私有函数GetSessionClientName()作为字符串
变暗lPtr为长
模糊和长
调用WTSQuerySessionInformation(WTS\u当前\u服务器\u句柄、WTS\u当前\u会话、WTSClientName、lPtr、lSize)
如果lPtr为0,则
GetSessionClientName=String$(lSize-1,0)
调用CopyMemory(ByVal GetSessionClientName、ByVal lPtr、lSize-1)
调用WTSFreeMemory(lPtr)
如果结束
端函数
专用子表单_加载()
MsgBox“GetSessionClientName=[”&GetSessionClientName()&“]”,VBEquipment
端接头

应该在哪里设置CLIENTNAME?在控制面板、系统、高级、环境中,还是通过其他方式?你能从一个你能看到它设置的外壳上运行你的VB应用程序吗?这个应用程序正在终端服务器客户端上运行。据我所知,CLIENTNAME是自动加载的,它包含客户端计算机名,而COMPUTERNAME包含服务器名。谢谢,这个解决方案很有效。但是,我仍然不知道为什么Environ()停止工作。@JGarate是否有人重新安装了会话主机服务器w/Windows server 2016?例如,对于在较新的操作系统版本/服务包中未标记为TSAware的VB6应用程序,可以使用自动appcompat垫片。