簡體   English   中英

在Excel VBA中登錄用戶名 - 而不是運行Excel的帳戶(使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM