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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Visual Basic 6中,Environ()函数为CLIENTNAME返回null值相关的知识,希望对你有一定的参考价值。

我在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

以上是关于在Visual Basic 6中,Environ()函数为CLIENTNAME返回null值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Basic 6 中制作表单模板?

如何在 Visual Basic 6 中对齐 RichEdit 粘贴对象位置?

Visual Basic 6 ActiveX 控件

Visual Basic 6代码中的运行时溢出错误

在Visual Basic 6中格式化文档(Ctrl + K,Ctrl + D)等效

在 ActiveX dll 项目中创建列表(对象),在 Visual Basic 6.0 中用于 c# 项目