Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[SPS2003]Impersonation et recherche dans une bibliothèque de doc um

5 réponses
Avatar
JULIEN
Bonjour,

Je developpe une webpart qui a pour objectif de parccourir les bibliothèques
de documents SPS afin de créer une liste des documents sousmis à approbation,
non encore traités. Cette webpart permet d'approuver ou de rejeter les
documents.
Si je me connecte en tant qu'administrateur du site : aucun problème, par
contre si je me connecte avec le login d'un utilisateur ayant droit à
l'approbation, mais non administrateur du site, la propriétés "AllWebs" ne
permet pas l'accès aux bibliothèques de document (Exception liée à la
sécurité).
L'utilisation de la méthode "GetAllSubSitesForCurrentUser()" n'est pas
satisfaisante car elle ne donne que les sous-sites de premier niveau.
La solution qui permettrait de résoudre ce problème semble donc être
l'"impersonation de code" avec la propriété "AllWebs".
Le problème est que cela ne fonctionne pas ! J'utilise l'impersonation de
code avec le compte administrateur et j'ai l'exception suivante :

Microsoft.SharePoint.SPException: Impossible de se connecter à la base de
données

En debuggant la webpart je m'aperçois que la méthode utilisée pour le login
fonctionne. De plus j'ai accordé tous les droits à l'assembly de la web part.

Le code utilisé est le suivant :

WindowsIdentity ImpersonateWebPart()
{
IntPtr tokenHandle = new IntPtr(0);
WindowsIdentity windowsIdentity = null ;
string strUserName = "Administrateur" ;
string strDomain = "DOMAIN" ;
string strPassword = "password";
try
{
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
tokenHandle = IntPtr.Zero ;
// Tentative de connexion, Si login impossible = une exception
est levée
bool bResult = LogonUser(strUserName, strDomain, strPassword,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
if (!bResult)
throw new Exception(Marshal.GetLastWin32Error().ToString());

windowsIdentity = new WindowsIdentity(tokenHandle);
if (tokenHandle != IntPtr.Zero)
CloseHandle(tokenHandle);

}
catch(Exception ex)
{
throw new Exception(ex.ToString() + " USER : " + strUserName +
"DOMAINE : " + strDomain + "PASSWORD : " + strPassword );
}
return windowsIdentity ;
}

L'appel à cette méthode se fait de la manière suivante :

// Impersonation
WindowsImpersonationContext windowsContext =
ImpersonateWebPart().Impersonate();
// Création de la liste des documents
GestSPS gestSPS = new CGestSPS(SiteUrl);
// On remplit la liste des documents
gestSPS.FillDocToWorkWith(m_lstDoc);
// Fin d'impersonation
if(windowsContext!=null)
windowsContext.Undo() ;

Or ceci ne fonctionne pas ....
Quelqu'un a t-il une idée ??

Merci.

5 réponses

Avatar
Renaud Comte
Pour la partie impersonnation :
http://www.15seconds.com/issue/040511.htm

Sinon de mon point de vue c'est inutile pour ce cas la ...
car vous allez presentez des documents à valider a des gens qui n'ont






pas acces don probléme

Honnetement, j'utiliserais GetAllSubSitesForCurrentUser et listforcurrentuseronly
ainsi qu'un checkpermission le tout dans une fonction reccursive
ensutie l'ensemble des doc serait stocké dans un datatable qui lui serait






utilisé pour le render via une smartpart par exemple

Voila :)


Renaud COMTE [MVP]
---------------------------------
http://blogs.developpeur.org/themit/
http://blog.spsclerics.com/

Bonjour,

Je developpe une webpart qui a pour objectif de parccourir les
bibliothèques
de documents SPS afin de créer une liste des documents sousmis à
approbation,
non encore traités. Cette webpart permet d'approuver ou de rejeter les
documents.
Si je me connecte en tant qu'administrateur du site : aucun problème,
par
contre si je me connecte avec le login d'un utilisateur ayant droit à
l'approbation, mais non administrateur du site, la propriétés
"AllWebs" ne
permet pas l'accès aux bibliothèques de document (Exception liée à la
sécurité).
L'utilisation de la méthode "GetAllSubSitesForCurrentUser()" n'est pas
satisfaisante car elle ne donne que les sous-sites de premier niveau.
La solution qui permettrait de résoudre ce problème semble donc être
l'"impersonation de code" avec la propriété "AllWebs".
Le problème est que cela ne fonctionne pas ! J'utilise l'impersonation
de
code avec le compte administrateur et j'ai l'exception suivante :
Microsoft.SharePoint.SPException: Impossible de se connecter à la base
de données

En debuggant la webpart je m'aperçois que la méthode utilisée pour le
login fonctionne. De plus j'ai accordé tous les droits à l'assembly de
la web part.

Le code utilisé est le suivant :

WindowsIdentity ImpersonateWebPart()
{
IntPtr tokenHandle = new IntPtr(0);
WindowsIdentity windowsIdentity = null ;
string strUserName = "Administrateur" ;
string strDomain = "DOMAIN" ;
string strPassword = "password";
try
{
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
tokenHandle = IntPtr.Zero ;
// Tentative de connexion, Si login impossible = une
exception
est levée
bool bResult = LogonUser(strUserName, strDomain,
strPassword,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
if (!bResult)
throw new
Exception(Marshal.GetLastWin32Error().ToString());
windowsIdentity = new WindowsIdentity(tokenHandle);
if (tokenHandle != IntPtr.Zero)
CloseHandle(tokenHandle);
}
catch(Exception ex)
{
throw new Exception(ex.ToString() + " USER : " +
strUserName +
"DOMAINE : " + strDomain + "PASSWORD : " + strPassword );
}
return windowsIdentity ;
}
L'appel à cette méthode se fait de la manière suivante :

// Impersonation
WindowsImpersonationContext windowsContext > ImpersonateWebPart().Impersonate();
// Création de la liste des documents
GestSPS gestSPS = new CGestSPS(SiteUrl);
// On remplit la liste des documents
gestSPS.FillDocToWorkWith(m_lstDoc);
// Fin d'impersonation
if(windowsContext!=null)
windowsContext.Undo() ;
Or ceci ne fonctionne pas ....
Quelqu'un a t-il une idée ??
Merci.



Avatar
JULIEN
Merci pour cette réponse, je vais pouvoir creuser davantage.

Pour infos :
Cependant les gens qui devront approuver ont accès à tous les documents,
le problème est que si nous utilisons la propriété "AllWebs", elle ne
fonctionne qui si l'utilisateur est administrateur, or cela ne sera pas
forcement le cas.

Nous avons bien pensé à un parcours récursif, mais la quantité de sites est
telle que les performances sont déplorables, alors qu'avec "AllWebs" elles
sont tout à fait acceptables.

Merci encore.


"Renaud Comte" a écrit :

Pour la partie impersonnation :
http://www.15seconds.com/issue/040511.htm

Sinon de mon point de vue c'est inutile pour ce cas la ...
>>> car vous allez presentez des documents à valider a des gens qui n'ont
pas acces don probléme

Honnetement, j'utiliserais GetAllSubSitesForCurrentUser et listforcurrentuseronly
ainsi qu'un checkpermission le tout dans une fonction reccursive
>>> ensutie l'ensemble des doc serait stocké dans un datatable qui lui serait
utilisé pour le render via une smartpart par exemple

Voila :)


Renaud COMTE [MVP]
---------------------------------
http://blogs.developpeur.org/themit/
http://blog.spsclerics.com/

> Bonjour,
>
> Je developpe une webpart qui a pour objectif de parccourir les
> bibliothèques
> de documents SPS afin de créer une liste des documents sousmis à
> approbation,
> non encore traités. Cette webpart permet d'approuver ou de rejeter les
> documents.
> Si je me connecte en tant qu'administrateur du site : aucun problème,
> par
> contre si je me connecte avec le login d'un utilisateur ayant droit à
> l'approbation, mais non administrateur du site, la propriétés
> "AllWebs" ne
> permet pas l'accès aux bibliothèques de document (Exception liée à la
> sécurité).
> L'utilisation de la méthode "GetAllSubSitesForCurrentUser()" n'est pas
> satisfaisante car elle ne donne que les sous-sites de premier niveau.
> La solution qui permettrait de résoudre ce problème semble donc être
> l'"impersonation de code" avec la propriété "AllWebs".
> Le problème est que cela ne fonctionne pas ! J'utilise l'impersonation
> de
> code avec le compte administrateur et j'ai l'exception suivante :
> Microsoft.SharePoint.SPException: Impossible de se connecter à la base
> de données
>
> En debuggant la webpart je m'aperçois que la méthode utilisée pour le
> login fonctionne. De plus j'ai accordé tous les droits à l'assembly de
> la web part.
>
> Le code utilisé est le suivant :
>
> WindowsIdentity ImpersonateWebPart()
> {
> IntPtr tokenHandle = new IntPtr(0);
> WindowsIdentity windowsIdentity = null ;
> string strUserName = "Administrateur" ;
> string strDomain = "DOMAIN" ;
> string strPassword = "password";
> try
> {
> const int LOGON32_PROVIDER_DEFAULT = 0;
> const int LOGON32_LOGON_INTERACTIVE = 2;
> tokenHandle = IntPtr.Zero ;
> // Tentative de connexion, Si login impossible = une
> exception
> est levée
> bool bResult = LogonUser(strUserName, strDomain,
> strPassword,
> LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
> if (!bResult)
> throw new
> Exception(Marshal.GetLastWin32Error().ToString());
> windowsIdentity = new WindowsIdentity(tokenHandle);
> if (tokenHandle != IntPtr.Zero)
> CloseHandle(tokenHandle);
> }
> catch(Exception ex)
> {
> throw new Exception(ex.ToString() + " USER : " +
> strUserName +
> "DOMAINE : " + strDomain + "PASSWORD : " + strPassword );
> }
> return windowsIdentity ;
> }
> L'appel à cette méthode se fait de la manière suivante :
>
> // Impersonation
> WindowsImpersonationContext windowsContext > > ImpersonateWebPart().Impersonate();
> // Création de la liste des documents
> GestSPS gestSPS = new CGestSPS(SiteUrl);
> // On remplit la liste des documents
> gestSPS.FillDocToWorkWith(m_lstDoc);
> // Fin d'impersonation
> if(windowsContext!=null)
> windowsContext.Undo() ;
> Or ceci ne fonctionne pas ....
> Quelqu'un a t-il une idée ??
> Merci.
>





Avatar
JULIEN
Ma problématique est de parcourir toutes les bibliothèques de tous les sites
dans toutes les zones, le moteur de recherche est-il capable de réaliser ceci
? Si oui, comment ?

Merci.


"Renaud Comte" a écrit :

Je vais peut etre dire une grosse bétise mais ...

Pourquoi ne pas utiliser le moteur de recherche pour identifier tous ces
documents, ce serait largement plus rapide non ?

Renaud COMTE [MVP]
---------------------------------
http://blogs.developpeur.org/themit/
http://blog.spsclerics.com/

> Merci pour cette réponse, je vais pouvoir creuser davantage.
>
> Pour infos :
> Cependant les gens qui devront approuver ont accès à tous les
> documents,
> le problème est que si nous utilisons la propriété "AllWebs", elle ne
> fonctionne qui si l'utilisateur est administrateur, or cela ne sera
> pas
> forcement le cas.
> Nous avons bien pensé à un parcours récursif, mais la quantité de
> sites est telle que les performances sont déplorables, alors qu'avec
> "AllWebs" elles sont tout à fait acceptables.
>
> Merci encore.
>
> "Renaud Comte" a écrit :
>
>> Pour la partie impersonnation :
>> http://www.15seconds.com/issue/040511.htm
>>
>> Sinon de mon point de vue c'est inutile pour ce cas la ...
>>
>>>>> car vous allez presentez des documents à valider a des gens qui
>>>>> n'ont
>>>>>
>> pas acces don probléme
>>
>> Honnetement, j'utiliserais GetAllSubSitesForCurrentUser et
>> listforcurrentuseronly ainsi qu'un checkpermission le tout dans une
>> fonction reccursive
>>
>>>>> ensutie l'ensemble des doc serait stocké dans un datatable qui lui
>>>>> serait
>>>>>
>> utilisé pour le render via une smartpart par exemple
>>
>> Voila :)
>>
>> Renaud COMTE [MVP]
>> ---------------------------------
>> http://blogs.developpeur.org/themit/
>> http://blog.spsclerics.com/
>>> Bonjour,
>>>
>>> Je developpe une webpart qui a pour objectif de parccourir les
>>> bibliothèques
>>> de documents SPS afin de créer une liste des documents sousmis à
>>> approbation,
>>> non encore traités. Cette webpart permet d'approuver ou de rejeter
>>> les
>>> documents.
>>> Si je me connecte en tant qu'administrateur du site : aucun
>>> problème,
>>> par
>>> contre si je me connecte avec le login d'un utilisateur ayant droit
>>> à
>>> l'approbation, mais non administrateur du site, la propriétés
>>> "AllWebs" ne
>>> permet pas l'accès aux bibliothèques de document (Exception liée à
>>> la
>>> sécurité).
>>> L'utilisation de la méthode "GetAllSubSitesForCurrentUser()" n'est
>>> pas
>>> satisfaisante car elle ne donne que les sous-sites de premier
>>> niveau.
>>> La solution qui permettrait de résoudre ce problème semble donc être
>>> l'"impersonation de code" avec la propriété "AllWebs".
>>> Le problème est que cela ne fonctionne pas ! J'utilise
>>> l'impersonation
>>> de
>>> code avec le compte administrateur et j'ai l'exception suivante :
>>> Microsoft.SharePoint.SPException: Impossible de se connecter à la
>>> base
>>> de données
>>> En debuggant la webpart je m'aperçois que la méthode utilisée pour
>>> le login fonctionne. De plus j'ai accordé tous les droits à
>>> l'assembly de la web part.
>>>
>>> Le code utilisé est le suivant :
>>>
>>> WindowsIdentity ImpersonateWebPart()
>>> {
>>> IntPtr tokenHandle = new IntPtr(0);
>>> WindowsIdentity windowsIdentity = null ;
>>> string strUserName = "Administrateur" ;
>>> string strDomain = "DOMAIN" ;
>>> string strPassword = "password";
>>> try
>>> {
>>> const int LOGON32_PROVIDER_DEFAULT = 0;
>>> const int LOGON32_LOGON_INTERACTIVE = 2;
>>> tokenHandle = IntPtr.Zero ;
>>> // Tentative de connexion, Si login impossible = une
>>> exception
>>> est levée
>>> bool bResult = LogonUser(strUserName, strDomain,
>>> strPassword,
>>> LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref
>>> tokenHandle);
>>> if (!bResult)
>>> throw new
>>> Exception(Marshal.GetLastWin32Error().ToString());
>>> windowsIdentity = new WindowsIdentity(tokenHandle);
>>> if (tokenHandle != IntPtr.Zero)
>>> CloseHandle(tokenHandle);
>>> }
>>> catch(Exception ex)
>>> {
>>> throw new Exception(ex.ToString() + " USER : " +
>>> strUserName +
>>> "DOMAINE : " + strDomain + "PASSWORD : " + strPassword );
>>> }
>>> return windowsIdentity ;
>>> }
>>> L'appel à cette méthode se fait de la manière suivante :
>>> // Impersonation
>>> WindowsImpersonationContext windowsContext > >>> ImpersonateWebPart().Impersonate();
>>> // Création de la liste des documents
>>> GestSPS gestSPS = new CGestSPS(SiteUrl);
>>> // On remplit la liste des documents
>>> gestSPS.FillDocToWorkWith(m_lstDoc);
>>> // Fin d'impersonation
>>> if(windowsContext!=null)
>>> windowsContext.Undo() ;
>>> Or ceci ne fonctionne pas ....
>>> Quelqu'un a t-il une idée ??
>>> Merci.





Avatar
JULIEN
Merci, je vais regarder de ce côté-ci et voir les possibilités offertes.

Pour info si ça peut aider qqun, j'ai trouvé le problème de mon
impersonation de code :
il ne faut pas utiliser pour l'API Win32 LogonUser:
LOGON32_LOGON_INTERACTIVE (valeur 2)
mais LOGON32_LOGON_NETWORK (valeur 3).
C'est poutant ce que j'avais trouvé en exemple ...

"Renaud Comte" a écrit :

Si les sotes sont indexés, il peut les toruver

un peu de SQL freetext et de modele objet et ca tourne
>>> jeter donc un oeil dans le SDK :)

Renaud COMTE [MVP]
---------------------------------
http://blogs.developpeur.org/themit/
http://blog.spsclerics.com/

> Ma problématique est de parcourir toutes les bibliothèques de tous les
> sites dans toutes les zones, le moteur de recherche est-il capable de
> réaliser ceci ? Si oui, comment ?
>
> Merci.
>
> "Renaud Comte" a écrit :
>
>> Je vais peut etre dire une grosse bétise mais ...
>>
>> Pourquoi ne pas utiliser le moteur de recherche pour identifier tous
>> ces documents, ce serait largement plus rapide non ?
>>
>> Renaud COMTE [MVP]
>> ---------------------------------
>> http://blogs.developpeur.org/themit/
>> http://blog.spsclerics.com/
>>> Merci pour cette réponse, je vais pouvoir creuser davantage.
>>>
>>> Pour infos :
>>> Cependant les gens qui devront approuver ont accès à tous les
>>> documents,
>>> le problème est que si nous utilisons la propriété "AllWebs", elle
>>> ne
>>> fonctionne qui si l'utilisateur est administrateur, or cela ne sera
>>> pas
>>> forcement le cas.
>>> Nous avons bien pensé à un parcours récursif, mais la quantité de
>>> sites est telle que les performances sont déplorables, alors qu'avec
>>> "AllWebs" elles sont tout à fait acceptables.
>>> Merci encore.
>>>
>>> "Renaud Comte" a écrit :
>>>
>>>> Pour la partie impersonnation :
>>>> http://www.15seconds.com/issue/040511.htm
>>>> Sinon de mon point de vue c'est inutile pour ce cas la ...
>>>>
>>>>>>> car vous allez presentez des documents à valider a des gens qui
>>>>>>> n'ont
>>>>>>>
>>>> pas acces don probléme
>>>>
>>>> Honnetement, j'utiliserais GetAllSubSitesForCurrentUser et
>>>> listforcurrentuseronly ainsi qu'un checkpermission le tout dans une
>>>> fonction reccursive
>>>>
>>>>>>> ensutie l'ensemble des doc serait stocké dans un datatable qui
>>>>>>> lui serait
>>>>>>>
>>>> utilisé pour le render via une smartpart par exemple
>>>>
>>>> Voila :)
>>>>
>>>> Renaud COMTE [MVP]
>>>> ---------------------------------
>>>> http://blogs.developpeur.org/themit/
>>>> http://blog.spsclerics.com/
>>>>> Bonjour,
>>>>>
>>>>> Je developpe une webpart qui a pour objectif de parccourir les
>>>>> bibliothèques
>>>>> de documents SPS afin de créer une liste des documents sousmis à
>>>>> approbation,
>>>>> non encore traités. Cette webpart permet d'approuver ou de rejeter
>>>>> les
>>>>> documents.
>>>>> Si je me connecte en tant qu'administrateur du site : aucun
>>>>> problème,
>>>>> par
>>>>> contre si je me connecte avec le login d'un utilisateur ayant
>>>>> droit
>>>>> à
>>>>> l'approbation, mais non administrateur du site, la propriétés
>>>>> "AllWebs" ne
>>>>> permet pas l'accès aux bibliothèques de document (Exception liée à
>>>>> la
>>>>> sécurité).
>>>>> L'utilisation de la méthode "GetAllSubSitesForCurrentUser()" n'est
>>>>> pas
>>>>> satisfaisante car elle ne donne que les sous-sites de premier
>>>>> niveau.
>>>>> La solution qui permettrait de résoudre ce problème semble donc
>>>>> être
>>>>> l'"impersonation de code" avec la propriété "AllWebs".
>>>>> Le problème est que cela ne fonctionne pas ! J'utilise
>>>>> l'impersonation
>>>>> de
>>>>> code avec le compte administrateur et j'ai l'exception suivante :
>>>>> Microsoft.SharePoint.SPException: Impossible de se connecter à la
>>>>> base
>>>>> de données
>>>>> En debuggant la webpart je m'aperçois que la méthode utilisée pour
>>>>> le login fonctionne. De plus j'ai accordé tous les droits à
>>>>> l'assembly de la web part.
>>>>> Le code utilisé est le suivant :
>>>>>
>>>>> WindowsIdentity ImpersonateWebPart()
>>>>> {
>>>>> IntPtr tokenHandle = new IntPtr(0);
>>>>> WindowsIdentity windowsIdentity = null ;
>>>>> string strUserName = "Administrateur" ;
>>>>> string strDomain = "DOMAIN" ;
>>>>> string strPassword = "password";
>>>>> try
>>>>> {
>>>>> const int LOGON32_PROVIDER_DEFAULT = 0;
>>>>> const int LOGON32_LOGON_INTERACTIVE = 2;
>>>>> tokenHandle = IntPtr.Zero ;
>>>>> // Tentative de connexion, Si login impossible = une
>>>>> exception
>>>>> est levée
>>>>> bool bResult = LogonUser(strUserName, strDomain,
>>>>> strPassword,
>>>>> LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref
>>>>> tokenHandle);
>>>>> if (!bResult)
>>>>> throw new
>>>>> Exception(Marshal.GetLastWin32Error().ToString());
>>>>> windowsIdentity = new WindowsIdentity(tokenHandle);
>>>>> if (tokenHandle != IntPtr.Zero)
>>>>> CloseHandle(tokenHandle);
>>>>> }
>>>>> catch(Exception ex)
>>>>> {
>>>>> throw new Exception(ex.ToString() + " USER : " +
>>>>> strUserName +
>>>>> "DOMAINE : " + strDomain + "PASSWORD : " + strPassword );
>>>>> }
>>>>> return windowsIdentity ;
>>>>> }
>>>>> L'appel à cette méthode se fait de la manière suivante :
>>>>> // Impersonation
>>>>> WindowsImpersonationContext windowsContext > >>>>> ImpersonateWebPart().Impersonate();
>>>>> // Création de la liste des documents
>>>>> GestSPS gestSPS = new CGestSPS(SiteUrl);
>>>>> // On remplit la liste des documents
>>>>> gestSPS.FillDocToWorkWith(m_lstDoc);
>>>>> // Fin d'impersonation
>>>>> if(windowsContext!=null)
>>>>> windowsContext.Undo() ;
>>>>> Or ceci ne fonctionne pas ....
>>>>> Quelqu'un a t-il une idée ??
>>>>> Merci.





Avatar
FLP
j'utilise cette methode dès qu'il s'agit de parcourir des sites pour
retrouver des documents et c'est extremement performant surtout quand on a
énormément de docs dispatchés un peu partout. c'est même incomparable vis à
vis d'une solution ou l'on va se balader dans les collections avec
SPWEB/SPSITE
les 2 seuls bémols :
-c'est qu'il faut être extremement rigoureux sur la requête que l'on monte
et sur les critères de retour sinon on se retrouve avec beaucoup de
"parasitage"
-on s'arrache vraiment les cheveux au départ quand on monte ses premières
requêtes, la doc étant plus que nulle. quoi que je suis surement mauvaise
langue, j'ai vu pas mal de choses passer ces derniers temps dessus.


"Renaud Comte" wrote:

Je vais peut etre dire une grosse bétise mais ...

Pourquoi ne pas utiliser le moteur de recherche pour identifier tous ces
documents, ce serait largement plus rapide non ?

Renaud COMTE [MVP]
---------------------------------
http://blogs.developpeur.org/themit/
http://blog.spsclerics.com/

> Merci pour cette réponse, je vais pouvoir creuser davantage.
>
> Pour infos :
> Cependant les gens qui devront approuver ont accès à tous les
> documents,
> le problème est que si nous utilisons la propriété "AllWebs", elle ne
> fonctionne qui si l'utilisateur est administrateur, or cela ne sera
> pas
> forcement le cas.
> Nous avons bien pensé à un parcours récursif, mais la quantité de
> sites est telle que les performances sont déplorables, alors qu'avec
> "AllWebs" elles sont tout à fait acceptables.
>
> Merci encore.
>
> "Renaud Comte" a écrit :
>
>> Pour la partie impersonnation :
>> http://www.15seconds.com/issue/040511.htm
>>
>> Sinon de mon point de vue c'est inutile pour ce cas la ...
>>
>>>>> car vous allez presentez des documents à valider a des gens qui
>>>>> n'ont
>>>>>
>> pas acces don probléme
>>
>> Honnetement, j'utiliserais GetAllSubSitesForCurrentUser et
>> listforcurrentuseronly ainsi qu'un checkpermission le tout dans une
>> fonction reccursive
>>
>>>>> ensutie l'ensemble des doc serait stocké dans un datatable qui lui
>>>>> serait
>>>>>
>> utilisé pour le render via une smartpart par exemple
>>
>> Voila :)
>>
>> Renaud COMTE [MVP]
>> ---------------------------------
>> http://blogs.developpeur.org/themit/
>> http://blog.spsclerics.com/
>>> Bonjour,
>>>
>>> Je developpe une webpart qui a pour objectif de parccourir les
>>> bibliothèques
>>> de documents SPS afin de créer une liste des documents sousmis à
>>> approbation,
>>> non encore traités. Cette webpart permet d'approuver ou de rejeter
>>> les
>>> documents.
>>> Si je me connecte en tant qu'administrateur du site : aucun
>>> problème,
>>> par
>>> contre si je me connecte avec le login d'un utilisateur ayant droit
>>> à
>>> l'approbation, mais non administrateur du site, la propriétés
>>> "AllWebs" ne
>>> permet pas l'accès aux bibliothèques de document (Exception liée à
>>> la
>>> sécurité).
>>> L'utilisation de la méthode "GetAllSubSitesForCurrentUser()" n'est
>>> pas
>>> satisfaisante car elle ne donne que les sous-sites de premier
>>> niveau.
>>> La solution qui permettrait de résoudre ce problème semble donc être
>>> l'"impersonation de code" avec la propriété "AllWebs".
>>> Le problème est que cela ne fonctionne pas ! J'utilise
>>> l'impersonation
>>> de
>>> code avec le compte administrateur et j'ai l'exception suivante :
>>> Microsoft.SharePoint.SPException: Impossible de se connecter à la
>>> base
>>> de données
>>> En debuggant la webpart je m'aperçois que la méthode utilisée pour
>>> le login fonctionne. De plus j'ai accordé tous les droits à
>>> l'assembly de la web part.
>>>
>>> Le code utilisé est le suivant :
>>>
>>> WindowsIdentity ImpersonateWebPart()
>>> {
>>> IntPtr tokenHandle = new IntPtr(0);
>>> WindowsIdentity windowsIdentity = null ;
>>> string strUserName = "Administrateur" ;
>>> string strDomain = "DOMAIN" ;
>>> string strPassword = "password";
>>> try
>>> {
>>> const int LOGON32_PROVIDER_DEFAULT = 0;
>>> const int LOGON32_LOGON_INTERACTIVE = 2;
>>> tokenHandle = IntPtr.Zero ;
>>> // Tentative de connexion, Si login impossible = une
>>> exception
>>> est levée
>>> bool bResult = LogonUser(strUserName, strDomain,
>>> strPassword,
>>> LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref
>>> tokenHandle);
>>> if (!bResult)
>>> throw new
>>> Exception(Marshal.GetLastWin32Error().ToString());
>>> windowsIdentity = new WindowsIdentity(tokenHandle);
>>> if (tokenHandle != IntPtr.Zero)
>>> CloseHandle(tokenHandle);
>>> }
>>> catch(Exception ex)
>>> {
>>> throw new Exception(ex.ToString() + " USER : " +
>>> strUserName +
>>> "DOMAINE : " + strDomain + "PASSWORD : " + strPassword );
>>> }
>>> return windowsIdentity ;
>>> }
>>> L'appel à cette méthode se fait de la manière suivante :
>>> // Impersonation
>>> WindowsImpersonationContext windowsContext > >>> ImpersonateWebPart().Impersonate();
>>> // Création de la liste des documents
>>> GestSPS gestSPS = new CGestSPS(SiteUrl);
>>> // On remplit la liste des documents
>>> gestSPS.FillDocToWorkWith(m_lstDoc);
>>> // Fin d'impersonation
>>> if(windowsContext!=null)
>>> windowsContext.Undo() ;
>>> Or ceci ne fonctionne pas ....
>>> Quelqu'un a t-il une idée ??
>>> Merci.