Чтобы получить полное имя пользователя в Windows, можно использовать функцию UserFullName:
Sub ПримерИспользованияUserFullName() ПолноеИмяПользователяWindows = WMI_UserFullName MsgBox ПолноеИмяПользователяWindows End Sub
Данная функция использует интерфейс WMI для получения необходимых данных.
Function WMI_UserFullName() As String login$ = CreateObject("WScript.Network").UserName ' читаем логин текущего пользователя Set objWMIService = GetObject("winmgmts://./root/CIMV2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", , 48) For Each objItem In colItems ' перебираем все учётные записи If objItem.Name = login$ Then WMI_UserFullName = objItem.FullName Next End Function
Посмотреть список всех учётных записей пользователей на компьютере можно следующим кодом:
Sub WMI_username() Set objWMIService = GetObject("winmgmts://./root/CIMV2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_UserAccount", , 48) For Each objItem In colItems Debug.Print "FullName: " & objItem.FullName Next End Sub
Результат работы этого кода:
FullName: ASP.NET Machine Account
FullName: Учетная запись помощника для удаленного рабочего стола
FullName: CN=Microsoft Corporation,L=Redmond,S=Washington, C=US
FullName:
FullName: VBA Developer
Если же вам нужно получить только логин (имя пользователя) Windows, то код будет заметно проще:
(все 3 способа равнозначны - возвращают один и тот же результат)
Sub ПолучениеИмениПользователяWindows() ' первый способ (читаем из переменной окружения) username1 = Environ("USERNAME") Debug.Print "username 1: " & username1 ' второй способ (используем объект WScript.Network) username2 = CreateObject("WScript.Network").UserName Debug.Print "username 2: " & username2 ' третий способ (читаем значение из реестра Windows) key$ = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RegisteredOwner" username3 = CreateObject("WScript.Shell").RegRead(key$) ' читаем из реестра Debug.Print "username 3: " & username3 End Sub
PS: При создании этого макроса была использована программа WMI Code Creator:
Комментарии
А разве Application.UserName ровно это и не возвращает?
Добрый день!
В этот код можно добавить адрес или IP?
Sub WMI_username()
Workbooks.Open "C:\Users\" & iName & "\Desktop\Áóôåðíûé ñêëàä.xlsx"
Dim iName As String
iName = Environ("UserName")
Workbooks.Open "C:\Users\iName\Desktop\Áóôåðíûé ñêëàä.xlsx"
Такая проблема, не могу получить адрес.
Выдает код ошибки 1004
При желании можно утяжелить код с помощью "Application.PathSeparator", дабы не зависеть от версий операционной системы.
Код, конечно, тестировался, - только на WindowsXP (да и в статье приведен результат работы кода)
Сейчас проверил - в WinXP код работает и с прямыми, и с обратными слешами.
Не знал, что в Win7 что-то поменяли в этом плане.
Исправил все слеши в коде.
Насчёт объявления переменных: видимо, у вас в настройках редактора VBA включена опция «Требовать объявление переменных»,
и, соответственно, первой строкой в модуле присутствует директива Option Explicit
Я же этот режим не использую - потому часто и не объявляю переменные в своих макросах.
Интересно - код в VBA тестировался? Например в фрагменте "winmgmts:\\.\root\CIMV2" отработка происходит и в случае, если наклон слэшей изменить - "winmgmts://./root/cimv2", а так же требуется объявление переменных... Конфа ПК, на котором тестировался код: Win 7 Pro x64, MS Office 2010.
Отправить комментарий