Nano Hash - криптовалюты, майнинг, программирование

Как использовать VBA или Powershell для экспорта списков с сервера Sharepoint с аутентификацией NTLM в Excel

Мой работодатель поручил мне найти способ автоматизировать загрузку/обновление списков SharePoint с сервера SharePoint 2013, использующего проверку подлинности NTLM. Возможными средствами для этого являются VBA или Powershell. Список, который я хочу получить, принадлежит деловому партнеру моей компании и содержит текущее состояние документов, которые должны быть написаны, проверены и опубликованы. Экспортированный список используется для сравнения между их базой данных (сервер SharePoint) и нашей (на базе Oracle).

Сначала я попытался использовать Powershell, но не смог выполнить аутентификацию NTLM и, следовательно, не смог получить какие-либо данные списка. Из того, что я читал в Интернете, мне нужно было иметь учетные данные администратора, которых у меня нет.

После этого я попытался использовать макрос VBA. Я вручную экспортировал список в Excel и, следовательно, имел соединение, которое я думал использовать для извлечения данных списка:

Sub UpdateandExport()

ActiveWorkbook.RefreshAll

Dim MyFileName As String
Dim CurrentWB As Workbook, TempWB As Workbook

Set CurrentWB = ActiveWorkbook
ActiveWorkbook.ActiveSheet.UsedRange.Copy

Set TempWB = Application.Workbooks.Add(1)
With TempWB.Sheets(1).Range("A1")
    .PasteSpecial xlPasteValues
    .PasteSpecial xlPasteFormats
End With

MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len (CurrentWB.Name) - 5) & ".csv"

Application.DisplayAlerts = False
TempWB.SaveAs Filename:="Export", FileFormat:=xlCSV, CreateBackup:=False, Local:=True
TempWB.Close SaveChanges:=False
Application.DisplayAlerts = True

ThisWorkbook.Close True

End Sub

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

Поэтому я попытался сначала пройти аутентификацию, прежде чем вытаскивать данные списка:

Sub Export()

Dim user As String
Dim Password As String

user = "DOMAIN\USERNAME" 'I enter my credentials here
Password = "PASSWORD"    'I enter my credentials here

With CreateObject("Microsoft.XMLHTTP")

.Open "GET", "https://aaaa.bbbbbbbb.cc/dd-ee/ffffffffff/_vti_bin/", False

.setRequestHeader "Authorization", "NTLM" + Base64Encode(user + ":" + Password)

.Send

End With

ActiveWorkbook.RefreshAll


Dim MyFileName As String
Dim CurrentWB As Workbook, TempWB As Workbook

Set CurrentWB = ActiveWorkbook
ActiveWorkbook.ActiveSheet.UsedRange.Copy

Set TempWB = Application.Workbooks.Add(1)
With TempWB.Sheets(1).Range("A1")
    .PasteSpecial xlPasteValues
    .PasteSpecial xlPasteFormats

End With

MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv"

Application.DisplayAlerts = False
TempWB.SaveAs Filename:="Export", FileFormat:=xlCSV, CreateBackup:=False, Local:=True
TempWB.Close SaveChanges:=False
Application.DisplayAlerts = True

ThisWorkbook.Close True

End Sub

Function Base64Encode(sText)
Dim oXML, oNode
Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
Set oNode = oXML.CreateElement("base64")
oNode.DataType = "bin.base64"
oNode.nodeTypedValue = Stream_StringToBinary(sText)
Base64Encode = oNode.Text
Set oNode = Nothing
Set oXML = Nothing
End Function

Function Stream_StringToBinary(Text)
Const adTypeText = 2
Const adTypeBinary = 1

'Create Stream object
Dim BinaryStream 'As New Stream
Set BinaryStream = CreateObject("ADODB.Stream")

'Specify stream type - we want To save text/string data.
BinaryStream.Type = adTypeText

'Specify charset For the source text (unicode) data.
BinaryStream.Charset = "us-ascii"

'Open the stream And write text/string data To the object
BinaryStream.Open
BinaryStream.WriteText Text

'Change stream type To binary
BinaryStream.Position = 0
BinaryStream.Type = adTypeBinary

'Ignore first two bytes - sign of
BinaryStream.Position = 0

'Open the stream And get binary data from the object
Stream_StringToBinary = BinaryStream.Read

Set BinaryStream = Nothing
End Function

Function Stream_BinaryToString(Binary)
Const adTypeText = 2
Const adTypeBinary = 1

'Create Stream object
Dim BinaryStream 'As New Stream
Set BinaryStream = CreateObject("ADODB.Stream")

'Specify stream type - we want To save text/string data.
BinaryStream.Type = adTypeBinary

'Open the stream And write text/string data To the object
BinaryStream.Open
BinaryStream.Write Binary

'Change stream type To binary
BinaryStream.Position = 0
BinaryStream.Type = adTypeText

'Specify charset For the source text (unicode) data.
BinaryStream.Charset = "us-ascii"

'Open the stream And get binary data from the object
Stream_BinaryToString = BinaryStream.ReadText
Set BinaryStream = Nothing
End Function

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

Поскольку я далеко не профессионал в VBA, я не могу придумать никакого другого обходного пути и поэтому полностью полагаюсь на ваши знания, чтобы удовлетворить пожелания моих работодателей.

Подводя итог: я ищу сценарий VBA для извлечения данных с сервера SharePoint 2013 с помощью NTLM без передачи учетных данных вручную. У меня нет прав администратора на сервере, и я не могу создать автоматический черновик с сервера.


Ответы:


1

Я буду использовать VBA для запуска PowerShell и запускать сценарий PowerShell для загрузки любых необходимых данных. Запустить другую программу на VBA довольно просто, поэтому я не буду это описывать.

Вот сценарий PowerShell для аутентификации с помощью NTLM, указав пользователя/пароль, BTW, вы можете использовать UseDefaultCredentials=$True в следующем коде, чтобы использовать текущего пользователя, вошедшего в систему.

Для этих заголовков, которые я только что скопировал из Fiddler, вам придется исправить их для вашего использования.

$url = "https://xxx.yyy/team/data.csv"

$request = [System.Net.WebRequest]::Create($url)
$request.Method="Get"
$credCache = new-object System.Net.CredentialCache
$creds = new-object System.Net.NetworkCredential("username","password", "domain")
$credCache.Add("https://xxx.yyy", "NTLM", $creds)
$request.Credentials = $credCache
$request.Headers.Add("Upgrade-Insecure-Requests", "1")
$request.Headers.Add("DNT", "1")
$request.Headers.Add("Accept-Encoding", "gzip, deflate, br")
$request.Headers.Add("Accept-Language", "en-US,en;q=0.9")
$request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
$request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
$response = $request.GetResponse()
$requestStream = $response.GetResponseStream()
$readStream = New-Object System.IO.StreamReader $requestStream
$data = $readStream.ReadToEnd()

Если все хорошо, в Fiddler вы увидите что-то вроде следующих заголовков http,

введите здесь описание изображения введите здесь описание изображения

PowerShell для аутентификации и загрузки, VBA для загрузки загруженного файла.

04.02.2019
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..