![](/img/trans.png)
[英]How to get username of logged-in user when application started with RUNAS
[英]Get logged on username in Excel VBA - not the account running Excel (using RunAs)
我使用普通的域憑據登錄了我的工作站。 我們稱之為AccountA。
然后我使用“以其他用戶身份運行”來啟動Excel。 我們稱之為賬戶B. 我這樣做是因為查詢某些SQL服務器所需的權限必須使用AccountB完成。
此時,我需要包含一個子例程來啟動Shell以創建目錄並在遠程服務器上移動文件。 AccountB沒有(也沒有)權限來執行此操作。 我的shell給了我一個拒絕訪問的消息。 精細。
所以現在,我需要讓VBA返回AccountA的名稱,這是我用來登錄計算機的帳戶。 我該怎么做呢?
我在這個網站上看到了很多例子以及其他會返回運行Excel(AccountB)的用戶名的例子。 但是,我還沒有看到任何會通過RunAs
將AccountA信息傳遞給Shell來執行具有適當權限的命令的示例。 以下是我嘗試過的一些事情,都返回了AccountB(通過RunAs
使用的帳戶啟動Excel)
具有在遠程服務器上運行cmd shell的權限的多個人將使用此應用程序,因此無法對AccountA進行硬編碼,並且必須以編程方式獲取。
' Access the GetUserNameA function in advapi32.dll and
' call the function GetUserName.
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Sub XXXXXXXXXX()
'//
ThisWorkbook.Sheets("XXXXXXXXXX").Activate ' select the worksheet for use
cmdString = UCase(Trim(ThisWorkbook.ActiveSheet.Cells(4, 4).Value)) 'get XXXXXXXXXX
'MsgBox cmdString
'retval = Shell("cmd.exe /k " & cmdString, vbNormalNoFocus)
'cmdString = "MkDir \\XXXXXXXXXX\g$\Tempski" 'fails - no permission
'Set the Domain
txtdomain = "XXXXXXXXXX"
'Acquire the currently logged on user account
'txtuser = "XXXXXXXXXX"
' Dimension variables
Dim lpBuff As String * 255
Dim ret As Long
' Get the user name minus any trailing spaces found in the name.
ret = GetUserName(lpBuff, 255)
If ret > 0 Then
GetLogonName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)
Else
GetLogonName = vbNullString
End If
MsgBox GetLogonName
Dim objNet As Object
On Error Resume Next
Set objNet = CreateObject("WScript.NetWork")
MsgBox "Network username is: " & objNet.UserName
Set objNet = Nothing
MsgBox "Environ username is: " & Environ("USERNAME")
MsgBox "Application username is: " & Application.UserName
MsgBox "Network username is: " & WindowsUserName
Dim strUser As String
strUser = ActiveDirectory.user()
MsgBox "Welcome back, " & strUser
CurrentWorkbenchUser = Environ("USERDOMAIN") & "\" & Environ("USERNAME")
MsgBox CurrentWorkbenchUser
Set WSHnet = CreateObject("WScript.Network")
UserName = WSHnet.UserName
UserDomain = WSHnet.UserDomain
Set objUser = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
GetUserFullName = objUser.FullName
MsgBox GetFullUserName
'//try to pass user credentials to shell - service account cannot run XXXXXXXXXX
'//This Works when txtdomain and txtuser are passed properly (MUST GRAB THESE SOMEHOW)
'retval = Shell("runas /user:" & txtdomain & "\" & txtuser & " ""cmd.exe /k dir /s *.*""", vbNormalFocus)
End Sub
上面的所有代碼都返回用於啟動Excel的帳戶 - 而不是我需要的帳戶,即我用來登錄計算機的帳戶。
基本方法是使用“run as”參數執行shell。
這是從ms視頻中刪除的代碼,只是為了確保來自下一個人或者gal的人有一個快速參考。
Sub RegisterFile(ByVal sFileName As String)
ShellExecute 0, "runas", "cmd", "/c regsvr32 /s " & """" & sFileName & """", "C:\", 0 'SW_HIDE =0
End Sub
另外,如果您只需要帳戶來訪問SQL服務器,您應該只需在vba MACRO中的連接字符串中設置帳戶即可。 我過去曾為Oracle DB做過這樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.