使用 VB6,如何在 Windows XP 上获取当前用户和域?

Posted

技术标签:

【中文标题】使用 VB6,如何在 Windows XP 上获取当前用户和域?【英文标题】:Using VB6, how do I get the current user and domain on Windows XP? 【发布时间】:2010-09-25 03:11:57 【问题描述】:

我需要当前用户和域。我正在使用 VB 6 应用程序。

谢谢

【问题讨论】:

【参考方案1】:

使用 WshNetwork 对象的以下方法,在您的项目中引用 Windows 脚本宿主对象模型后可用:

Dim Network As WshNetwork
Set Network = New WshNetwork

Debug.Print "ComputerName: " & Network.ComputerName
Debug.Print "UserDomain: " & Network.UserDomain
Debug.Print "UserName: " & Network.UserName

为了保持一致性,我将结果转换为大写或小写,但这些是您需要的方法。

请注意,当在未登录域的机器上运行时,ComputerName 和 UserDomain 都返回相同的东西——计算机名称。

【讨论】:

【参考方案2】:

以及 API 版本:

Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long  

Declare Function LookupAccountName Lib "advapi32.dll" Alias "LookupAccountNameA" (lpSystemName As String, ByVal lpAccountName As String, sid As Any, cbSid As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, peUse As Long) As Long

Private Sub Form_Load()  
     Dim sDomainName As String * 255   
     Dim lDomainNameLength As Long     
     Dim sUserName as String
     Dim bUserSid(255) As Byte      
     Dim lSIDType As Long 

    Rem Create a buffer
    sUserName = String(100, Chr$(0))  

    Rem Get the username
     GetUserName sUserName, 100  

    Rem strip the rest of the buffer
    sUserName = Left$(sUserName, InStr(sUserName, Chr$(0)) - 1)

     rem Show the temppath and the username
     MsgBox "Hello " + strUserName 

     lResult = LookupAccountName(vbNullString, sUserName, bUserSid(0), 255, sDomainName, lDomainNameLength, _
  lSIDType)
    if lResult <>0 then
       msgbox sDomainName
    end if
end sub

【讨论】:

【参考方案3】:

基本上,您需要进行 Windows API 调用。 搜索 vbnet.mvps.org 得到以下答案。

get domain name get thread user name (run as) get logged on user

【讨论】:

【参考方案4】:

这个怎么样?

Private Function IsAdmin() As Boolean
Dim groups As Object
Dim user As Object

Set groups = GetObject("WinNT://./administrators")

For Each user In groups.members

If UCase(Environ("USERNAME")) = UCase(user.Name) Then
IsAdmin = True
End If

Next user

End Function

【讨论】:

不推荐使用此实现,即使是为了确定用户是否具有管理权限。首先,没有设置默认返回值,即使它是 False 隐含的。其次,一旦名称匹配,您应该退出 For 循环。 代码可能不太理想,但它确实回答了问题,即 Environ("USERNAME")【参考方案5】:

一种方法是询问环境:

Dim UserName As String
Dim UserDomain As String
UserName   = Environ("USERNAME")
UserDomain = Environ("USERDOMAIN")

(显然,仅适用于 Windows NT 及更高版本。)

【讨论】:

如果您需要根据当前用户进行检查,这是非常不安全的。修改环境变量就足够了(在命令提示符中使用SET USERNAME=pwned 并从该提示符运行应用程序)。 “不安全”这个词意味着它存在安全风险。事实并非如此。当然,可以写入进程的整个环境,但通常是这样——尽管如此,各种应用程序都从环境中读取它们的内容。如果有人将需要适当授权的任务建立在他们从环境中读取的值上,那么这完全是他们的错。 我想在上面的评论中添加更多信息,但昨天不管什么原因阻止了我。我的意思是强调 Stefan 发布的 API 版本从安全的角度来看要好一些,因为用户名是使用 Win32 API 提供的,并且不能像环境变量 USERNAME/USERDOMAIN 那样容易修改。 我明白这一点。我的观点是,这不应该首先用于与安全相关的任务。 Windows 有一个内置的身份验证和安全方案:绑定到进程的帐户令牌决定了您的访问权限,而不是您从一个函数或另一个函数读取的字符串。

以上是关于使用 VB6,如何在 Windows XP 上获取当前用户和域?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows XP 上获取已连接显示器的类型?

在 Windows XP 上获取现有 USB 设备的 GUID

VB6在win10下的使用经验

VB6中如何获得指定进程名称

XP之后的每个Windows版本都包含MSVBVM60.DLL吗?

Windows 7 中 VB6 的 .NET COM 问题:事件不起作用