Получить имя пользователя в Excel VBA - не учетная запись, выполняемая в Excel (с использованием RunAs)

Я зашел на свою рабочую станцию ​​с моими учетными данными обычного домена. Мы будем называть эту учетную запись.

Затем я использую "запуск как другой пользователь" для запуска Excel. Мы будем называть это AccountB. Я делаю это, потому что разрешения, необходимые для запроса некоторых SQL-серверов, должны выполняться с использованием AccountB.

В этот момент мне нужно включить подпрограмму для запуска оболочки для создания каталогов и перемещения файлов на удаленном сервере. У AccountB нет (и не может быть) разрешений для этого. Моя оболочка дает мне сообщение Access Denied. Хорошо.

Итак, теперь мне нужно вернуть VBA имя AccountA, учетной записи, которую я использовал для входа в компьютер. Как мне это сделать?

Я видел немало примеров на этом сайте, а также других, которые вернут имя пользователя, использующего Excel (AccountB). Тем не менее, я не видел никаких примеров, которые будут выводить информацию AccountA для передачи в оболочку через RunAs для выполнения моих команд с соответствующими разрешениями. Ниже приведены некоторые вещи, которые я пробовал, все возвращающие AccountB (учетная запись, используемая через RunAs для запуска Excel)

Это приложение будет использоваться несколькими людьми с разрешениями на запуск оболочки cmd на удаленном сервере, поэтому 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 - не то, что мне нужно, то есть учетная запись, которую я использовал для входа в компьютер.

Ответ 1

Основной подход заключается в том, чтобы выполнить оболочку с параметром "run as".

  • Вы взглянули на this
  • также смотрите здесь

Это код, разорванный с прицела мс и только здесь, чтобы убедиться, что следующий парень или галль, который приходит, имеет быструю ссылку.

Sub RegisterFile(ByVal sFileName As String)
ShellExecute 0, "runas", "cmd", "/c regsvr32 /s " & """" & sFileName & """", "C:\", 0 'SW_HIDE =0
End Sub

В стороне, если вам нужна только учетная запись для доступа к SQL-серверу, вы должны просто установить учетную запись в строке подключения в вашем MAC-адресе vba. Я делал это для Oracle DB в прошлом.