2008-12-03 177 views

回答

16

一种方法是问环境:

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

+0

如果您需要根据当前用户进行检查,这是非常不安全的。修改环境变量就足够了(在命令提示符中使用`SET USERNAME = pwned`并从该提示符运行应用程序)。 – Fulvio 2016-03-10 19:04:11

+0

“不安全”一词意味着它存在安全风险。事实并非如此。当然,流程的整个环境都可以写入,但通常情况就是这样 - 尽管如此,各种应用程序都是从环境中读取它们的内容。如果任何人根据他们从环境中读取的值确定需要适当授权的任务,那完全是他们的错。 – Tomalak 2016-03-10 19:30:07

0

这个什么(在Windows NT工程和仅占明显。)?

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 
8

和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 
4

使用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都返回相同的东西 - 计算机名称。