MS-Access в Sharepoint - какие данные доступны? - PullRequest
1 голос
/ 17 июня 2019

К лучшему или худшему, мы запускаем Access db с Sharepoint.Обратите внимание, что эта БД не ОПУБЛИКОВАНА в SP, люди просто дважды щелкают ссылку и открывают БД на своих рабочих столах.

Так что теперь нам нужно начать вводить эквивалент некоторых ограничений на редактирование на основе ролей.Я знаю, что есть функция VBA CurrentWebUser и CurrentWebUserGroups, которые предоставляют некоторые основные данные о том, кто получает доступ к файлу Office из Sharepoint.Однако мое чтение и ограниченные эксперименты с этим материалом заставляют меня подозревать, что, по крайней мере, для Access они будут работать только с опубликованными базами данных, а не с теми, которые просто запускаются и запускаются локально, как мы.

Могу ли я получить что-либо от SP в таком случае?Веб-пользователь и группа пользователей были бы полезны, так что какой бы сайт / страницу ни щелкала ссылка.Доступно ли что-нибудь из этого?

Спасибо.

Кролик

1 Ответ

0 голосов
/ 18 июня 2019

Ну, не совсем так.

Как вы уже определили, 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
...