Ну, не совсем так.
Как вы уже определили, Application.CurrentWebUser
просто возвращает ноль.
Однако есть несколько способов запроса информации о пользователях из SharePoint.
Рекомендованный способ (в том числе и мной), если вы собираетесь интенсивно работать с SharePoint, - использовать API CSOM, для которого требуется язык .Net, поэтому вам придется создать модуль COM, аутентифицировать его отдельно и это все много работы.
Однако, если вы используете только простые запросы GET, вы также можете использовать API REST и повторно использовать аутентификацию, которую использует MS Access (поскольку MS Access использует MSXML2 для отправки веб-запросов в SharePoint, мы можем создать наш собственный MSXML2.XMLHTTP, и он будет повторно использовать файлы cookie, используемые Access).
В следующем коде используется объект JSONInterpreter, которым я поделился здесь, на GitHub . Вы можете преобразовать его в XML и MSXML, если не хотите использовать эту зависимость.
Для выполнения запроса я использую следующий код, который предполагает, что приложение Access аутентифицировано, но если это не так, оно подключается к сайту SharePoint с помощью ADO.
(для этого кода MySiteName
- это глобальная переменная, содержащая URL-адрес вашего сайта SharePoint, без косой черты)
Public Function SPRestGetJSON(Site As String, Request As String) As String
Dim tries As Long
Dim Success As Boolean
Do
'Try to execute request
tries = tries + 1
Dim xmlHttpReq As Object 'MSXML2.XMLHTTP60
Set xmlHttpReq = CreateObject("Msxml2.XMLHTTP.6.0") 'New MSXML2.XMLHTTP60
xmlHttpReq.Open "GET", Site & Request, False
xmlHttpReq.setRequestHeader "Content-Type", "application/json"
xmlHttpReq.setRequestHeader "Accept", "application/json;odata=nometadata"
xmlHttpReq.send
Dim root As JSONInterpreter
Set root = New JSONInterpreter
root.JSON = xmlHttpReq.responseText
If Not root.Exists("odata.error") Then
Success = True
End If
If Not Success And tries = 1 Then
'Connect to SharePoint using WSS + ADO to create auth cookies inside MSXML
Dim conn As Object 'ADODB.Connection
Set conn = CreateObject("ADODB.Connection") 'New ADODB.Connection
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;WSS;DATABASE=" & Site
On Error Resume Next
conn.Execute "SELECT 1 From SomeTable" 'Execute to non-existent table but connect to sharepoint
On Error GoTo 0
conn.Close
End If
Loop While tries < 2 And Success = False
SPRestGetJSON = xmlHttpReq.responseText
End Function
Затем мы можем использовать это в простой функции:
Public Function GetSPUsername() As String
Dim jsi As New JSONInterpreter
jsi.JSON = SPRestGetJSON(MySiteName, "/_api/Web/CurrentUser")
GetSPUsername = jsi.item("LoginName").VBAVariant
End Function
Получение групп также доступно. Этот код возвращает массив объектов словаря, вы можете просмотреть доступные ключи в окне локальных:
Public Function GetSPGroups() As Variant 'Array of dictionaries
Dim jsi As New JSONInterpreter
jsi.JSON = SPRestGetJSON(SiteName, "/_api/Web/CurrentUser/Groups")
GetSPGroups = jsi.item("value").VBAVariant
End Function
Затем, чтобы получить заголовок первой группы, членом которой является текущий пользователь, в ближайшем окне, мы можем использовать:
?GetSPGroups(0)!Title