Hi,

ich greife inzwischen erfolgreich über VB auf SharePoint (in dem Falle Sharepoint Online) zu. Ich habe eine Crawler gebaut, der über den SharePoint drüber geht und Dateinamen sammelt. Klappt genau wie ich das haben will. Stellt Euch vor, ich habe jetzt zig hundert Dateinamen in einer Liste. Jetzt gehe ich ein paar Tage später mit der Liste über den SharePoint drüber und will schauen, ob die Dateien noch da sind. Klappt auch.

Aber: Da ich nicht weiß, auf welche Ebene die Credentials "greifen" versuche ich es immer von "unten nach oben" und teste auf die Credentials. Code steht unten.

Was mich nachhaltig stört ist natürlich, dass es dabei immer auch mal zu abgelehnten Zugriffen kommen kann, wenn die Berechtigungen auf der Ebene nicht gesetzt sind. Das kostet jede Menge Zeit.

Meine konkrete Frage: Weiß jemand, wie ich fix rausbekommen kann, auf welcher Ebene in einem Verzeichnispfad die Credentials liegen bzw. angefragt werden müssen? Vielleicht stelle ich mich auch viel zu umständlich an, bin mir da nicht sicher.

Beispiel:

Datei: https://company-my.sharepoint.com/pe...1OneDrive.xlsx

1. Versuch:

https://company-my.sharepoint.com/personal/vorname_nachname_mycompany_onmicrosoft_com/Documents/ --> Geht schief, keine "Credentials"

2. Versuch

https://company-my.sharepoint.com/pe...microsoft_com/ --> Klappt, Credentials vorhanden, ich kann zugreifen.

Vielen Dank im Voraus!

Bat


Function GetSharepointClientContextFromFile(ByVal filename As String, ByVal SUsername As String, ByVal sKennwort As String,
ByRef spClientContext As ClientContext, ByRef errorstack As String) As Boolean


errorstack = ""
Dim a() As String

' Erst mal den Pfad aus der Datei holen
Dim pth As String
pth = Left(filename, filename.Length() - Path.GetFileName(filename).Length())

If Right(pth, 1) = "/" Then pth = Left(pth, Len(pth) - 1)
a = pth.Split("/")
If a.GetUpperBound(0) = 0 Then Return False
If a(0).ToUpper() <> "HTTP:" And a(0).ToUpper() <> "HTTPS:" Then Return False

If a.GetLowerBound(0) + 2 > a.GetUpperBound(0) Then Return False

For i As Long = a.GetUpperBound(0) To a.GetLowerBound(0) + 2 Step -1
Dim s As String
s = ""
For j As Long = a.GetLowerBound(0) To i
s = s & a(j) & "/"
Next j
Debug.Print("Test: " & s)
If GetSharepointClientContextSub(s, SUsername, sKennwort, spClientContext, errorstack) Then
Debug.Print("Found")
Return True
End If
Next i

return false
end function

Und die Func ist so:



Private Function GetSharepointClientContextSub(ByVal pth As String, ByVal SUsername As String, ByVal sKennwort As String,
ByRef spClientContext As ClientContext, ByRef errorstack As String) As Boolean

Try
spClientContext = New ClientContext(pth)

Dim passWord As SecureString = New SecureString()
For i As Long = 0 To Len(sKennwort) - 1
passWord.AppendChar(sKennwort.Chars(i))
Next
spClientContext.Credentials = New SharePointOnlineCredentials(SUsername, passWord)

Dim Web As Web = spClientContext.Web
spClientContext.Load(Web)
spClientContext.ExecuteQuery()

Return True
Catch ex As Exception
errorstack = errorstack & IIf(errorstack <> "", ", ", "") & "(Pfad: " & pth & ": " & ex.HResult & " - " & ex.Message & ")"
Return False
End Try
End Function