2009-02-11 8 views
1

Voici mon extrait de code:SPFarm.Local.Solutions.Add - Exception - "Accès refusé"

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    SPSolution newSolution = SPFarm.Local.Solutions.Add(@fullPath);        
}); 

Le stacktrace et InnerException donnent pas d'autres indices. L'Exception.Source dit Microsoft.SharePoint.

SPFarm.Local.CurrentUserIsAdministrator() renvoie la valeur TRUE pour l'ID utilisateur.

L'ID utilisateur se trouve dans le groupe Administrateurs de batterie.

Des idées?

EDIT

J'ai changé mon code pour ce qui suit et toujours obtenir l'erreur Accès refusé:

private void AddSolution() 
{ 
    SPSolution newSolution = SPFarm.Local.Solutions.Add(@fullPath); 
} 

SPSecurity.CodeToRunElevated elevatedAddSolution = new SPSecurity.CodeToRunElevated(AddSolution); 
SPSecurity.RunWithElevatedPrivileges(elevatedAddSolution); 

Répondre

1

Votre problème principal pourrait bien être que vous n'êtes pas DBO d'une base de données sharepoint (_Config si je ne me trompe pas). L'ajout d'une solution à une batterie nécessite plus de droits que l'accès à la batterie de serveurs.

Assurez-vous que l'utilisateur qui exécute ceci est Farm Administrator et DBO de la base de données appropriée.

Si vous avez encore problème ... essayez d'exécuter

stsadm -o addsolution -filename "myWsp.wsp"

Si vous avez le droit approprié, il vous donnera l'erreur appropriée.

+0

C'est ce que le problème est. Je lance stsadm, il obtient et erreur, je regarde dans les journaux d'événements et il dit que mon ID utilisateur n'a pas accès à la base de données de configuration. –

1

Avez-vous essayé de déclarer le délégué à l'extérieur de l'appel à RunWithElevatedPriviliges?

Modifier: Ignorer ci-dessous car vous semblez avoir vérifié les autorisations. RunWithElevatedPriviliges utilisera l'identité du pool d'applications dans lequel s'exécute SP.

Avez-vous veillé à ce que ce compte dispose de privilèges suffisants dans votre environnement?

+0

Que signifie votre première question? –

+0

Je voulais dire essentiellement essayer ce que vous avez fait ci-dessus, bien qu'il semble ne pas avoir fonctionné. – Charlie

+0

L'exécutez-vous sur un service Web local comme indiqué précédemment? – Charlie

1

Je crois que le problème que vous rencontrez est dû au fait que vous utilisez le membre statique pour accéder à l'objet SPFarm. Je pense qu'il est similaire à l'exécution de la classe statique SPcontext qui s'exécutera toujours dans le contexte de sécurité de l'utilisateur connecté et non dans le contexte privilégié élevé (qui est l'identité du pool d'applications local).

Essayez ceci à la place dans votre délégué:

SPFarm spFarm = SPWebService.AdministrationService.Farm; 
SPSolution newSolution = spFarm.Solutions.Add(@fullPath); 

EDIT: Depuis ce qui précède n'a pas aidé alors votre question a probablement à voir avec les droits de base de données à la base de données de configuration. RunWithElevatedPriviliges s'exécutera sous l'identité du pool d'applications sous lequel s'exécute le code. L'ajout d'une solution à votre batterie affecte la base de données de configuration, de sorte que votre identité du pool d'applications doit avoir accès à la base de données de configuration. En tant que test, essayez d'ajouter l'identité du pool d'applications à la base de données de configuration et de lui attribuer des autorisations dbo. Si cela résout le problème, vous devrez trouver le nombre minimum d'autorisations dont chacun de vos comptes de pool d'applications aura besoin pour ajouter des solutions (ne pas laisser dbo)

+0

Fait ce changement, mais toujours la même erreur. –

+0

Je montre ma paresse et mon ignorance. Comment puis-je trouver le nom de la base de données CONFIG? –

+0

Registre: HKLM \ Software \ Microsoft \ Outils partagés \ Extensions serveur Web \ 12.0 \ Secure \ ConfigDb – webwires

Questions connexes