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

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

谢谢

【问题讨论】:

    标签: vb6 windows-xp


    【解决方案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 得到以下答案。

        【讨论】:

          【解决方案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 有一个内置的身份验证和安全方案:绑定到进程的帐户令牌决定了您的访问权限,而不是您从一个函数或另一个函数读取的字符串。
          猜你喜欢
          • 1970-01-01
          • 2012-07-20
          • 2011-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-06
          • 1970-01-01
          相关资源
          最近更新 更多