如何使用VBA或PowerShell来使用NTLM身份验证导出从SharePoint服务器列表到Excel

问题描述 投票:2回答:1

我的雇主负责我找到一种方法来自动下载/从使用NTLM身份验证在SharePoint 2013服务器更新SharePoint列表。可能的方式做到这一点是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提取数据,而无需手动传递凭据。我没有管理员权限的服务器,有没有办法从服务器创建一个自动草案。

excel vba sharepoint automation credentials
1个回答
0
投票

我会用VBA来启动PowerShell和运行PowerShell脚本下载任何数据通缉。这是很容易在VBA启动其他程序,所以我不打算来形容它。

下面是PowerShell脚本通过给用户/密码使用NTLM身份验证,顺便说一句,你可以使用UseDefaultCredentials=$True在下面的代码使用当前登录的用户。

对于这些标题,我刚刚从提琴手复制,你将不得不纠正他们为您的使用。

$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()

如果一切良好,在提琴手,你会看到类似的HTTP头以下,

enter image description here enter image description here

PowerShell中做身份验证及下载工作,VBA加载下载的文件。

© www.soinside.com 2019 - 2024. All rights reserved.