2 votes

Authentification VBA SharePoint pour le mappage de lecteur

J'ai réussi à utiliser VBA dans Excel pour mapper un lecteur vers extranet SharePoint afin de télécharger des fichiers, cependant lors du déploiement, cela fonctionne dans un emplacement mais pas dans un autre (différents environnements possibles). Je me demande si quelqu'un a des informations sur quel paramètre utilisateur ou système pourrait causer cela.

Dans le code ci-dessous, j'essaie de mapper le lecteur vers SharePoint. S'il y a une erreur, le gestionnaire crée une nouvelle instance d'Excel et la sauvegarde sur le site SharePoint. Par nature, cela force IE à s'ouvrir et à demander les détails de connexion de l'utilisateur, une fois soumis, cela les authentifie et télécharge le fichier. Ils peuvent ensuite mapper le lecteur vers SharePoint. Le problème que j'ai avec un groupe est qu'il téléchargera le fichier, cependant ils ne restent pas authentifiés pour mapper le lecteur. Encore plus étrange, l'utilisateur est connecté au site SharePoint dans IE pendant que je passe par cette procédure.

Sub MapSharePoint()
    Dim objNet as object
    Dim strDriveLetter as String
    Dim strSharePointDatabaseFolder as String
    Set objNet = CreateObject("WScript.Network")

    On Error GoTo AUTH_Connection:
    strDriveLetter = 
    strSharePointDatabaseFolder = 
    objNet.MapNetworkDrive strDriveLetter, strSharePointDatabaseFolder

    Exit Sub

AUTH_Connection:

    Dim xlApp As New Excel.Application
    Dim xlDoc As Workbook
    On Error GoTo ErrHandler:

    Set xlApp = CreateObject("Excel.Application")
    Set xlDoc = xlApp.Workbooks.Add
    ' En essayant de télécharger le fichier ci-dessous, IE s'ouvrira et demandera à l'utilisateur son nom d'utilisateur et mot de passe pour les authentifier
    xlDoc.SaveAs FileName:="", FileFormat:=xlWorkbookNormal, AddToMru:=False
    xlDoc.Close
    xlApp.Quit

    objNet.MapNetworkDrive strDriveLetter, strSharePointDatabaseFolder
    Resume Next
ErrHandler:
    MsgBox Err.Code, Err.Description

Fin Sub

MISE À JOUR 1:

Avec le code ci-dessous, le problème auquel je suis confronté est l'authentification SharePoint. Dans les accolades catch, j'ai ajouté la ligne de code ci-dessous pour afficher une fenêtre de message avec le texte d'erreur spécifique, et j'obtenais 403: Interdit. Après avoir téléchargé Fiddler, je peux voir que le site utilise un cookie d'authentification, que WebClient ne prend pas en charge. J'ai essayé de capturer le cookie et de m'authentifier en l'utilisant, donc maintenant je ne reçois pas l'erreur 403, mais à la place, je télécharge le code HTML du formulaire de connexion. Je dois trouver comment envoyer une demande de connexion, capturer le cookie d'authentification qui revient, puis l'utiliser lors de l'envoi de la demande DownloadFile.

System.Windows.Forms.MessageBox.Show(ex.Message);

2voto

SlowLearner Points 1389

Pour ce que ça vaut, voici le code que j'ai finalement utilisé. Il était plus facile d'apprendre assez de C# (première fois en utilisant C#) pour faire cela que d'essayer de le comprendre avec VBA. Les arguments (fichiers à télécharger) sont passés en tant que chaîne et divisés en un tableau. J'espère que cela aide.

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;
using System.Windows.Forms;

namespace sptHELPER { 
public class sptDL
{
    [DllExport("getResources", System.Runtime.InteropServices.CallingConvention.StdCall)]
    public static Int32 sptDownLoader(string sptURL, string sptItem, string sptTemp, string sptUser = "", string sptPass = "")
    {
        //System.Windows.Forms.MessageBox.Show("Dans la fonction");
        int Result = 0;
        Result = 0;

        System.Net.NetworkCredential myCredentials = new System.Net.NetworkCredential();

        if (string.IsNullOrEmpty(sptUser))
        {
            myCredentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        }
        else
        {
            myCredentials.UserName = sptUser;
            myCredentials.Password = sptPass;
            myCredentials.Domain = "";
        }

        // définir une Uri temporaire pour capturer une Uri invalide plus tard
        Uri mySiteSP = new Uri("http://www.defaultfallback");

        string myFile = null;

        int iCount = 0;
        string[] arr1 = sptItem.Split('*');
        arr1 = sptItem.Split('*');

        StandAloneProgressBar sp = new StandAloneProgressBar();

        for (iCount = arr1.GetLowerBound(0); iCount <= arr1.GetUpperBound(0); iCount++)
        {
            try
            {
                myFile = arr1[iCount];
                mySiteSP = new Uri(sptURL + "/" + myFile);
                string dest = sptTemp + "/" + myFile;
                dest = dest.Replace("/", "\\") ;
                //System.Windows.Forms.MessageBox.Show(dest + " " + sptURL + "/" + myFile);
                System.Net.WebClient mywebclient = new System.Net.WebClient();
                mywebclient.Credentials = myCredentials;
                mywebclient.DownloadFile(mySiteSP, dest);
            }

            catch (Exception ex)
            {
                Result = ex.HResult;
                break; 
            }
        }
        return Result;
    }
}
}

En VBA, ajoutez un module avec le code suivant, modifié pour répondre à vos besoins :

Option Explicit

#If VBA7 Then ' Office 2010 ou ultérieur (32/64 bits)...
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare PtrSafe Function sptDL Lib "sptHELPER.dll" Alias "getResources" (ByVal sptURL As String, ByVal sptItem As String, ByVal sptTemp As String, ByVal sptUser As String, ByVal sptPass As String) As Integer
#Else
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function sptDL Lib "sptHELPER.dll" Alias "getResources" (ByVal sptURL As String, ByVal sptItem As String, ByVal sptTemp As String, ByVal sptUser As String, ByVal sptPass As String) As Integer
#End If

Private Type sptSP_Data
    sptURL As String
    sptResourceNames As String
    sptUserName As String
    sptPassWord As String
    sptdomain As String
    sptDestination As String
End Type

' But :
' Obtenir des ressources à partir de SharePoint (ou du site Web)
Function getSharePointItems() As Boolean

    Dim strTemp As String
    Dim strRes() As String
    Dim lLib As Long
    Dim result As Double ' obtenir le code d'erreur
    Dim sptData As sptSP_Data ' Type privé ci-dessus

    ' 1. Paramètres de SharePoint
    sptData.sptURL = "" ' par exemple "http://testsp-mysite.cloudapp.net/sites/spTesting/"
    sptData.sptUserName = ""
    sptData.sptPassWord = ""
    sptData.sptdomain = "" ' J'ai laissé ceci vide
    sptData.sptResourceNames = "strRes1*strRes2*strRes3*strRes4*strRes5"
    sptData.sptDestination = "" ' devrait déjà être créé

    ' Utiliser sptHELPER pour obtenir des ressources
    lLib = LoadLibrary(ThisWorkbook.Path & "\sptHELPER.dll")
    result = sptDL(sptData.sptURL, sptData.sptResourceNames, sptData.sptDestination, sptData.sptUserName, sptData.sptPassWord)
    Debug.Print result
    FreeLibrary (lLib)

    ' Voir si nous avons réussi
    Select Case result
        Case 0
             ' Tout va bien
        Case 5385 ' Mauvaise URL ou pas de réponse du serveur Web
            Debug.Print "Mauvaise URL ou pas de réponse du serveur Web"

        Case 5431 ' L'URL est vide ou n'est pas un format valide
            Debug.Print "L'URL est vide ou n'est pas un format valide, http:// manquant"

        Case Else
            ' erreur inconnue
            Debug.Print "Erreur : " & result & " dans getSharePointItems"
    End Select

End Function

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X