2008-08-06 28 views
6

J'ai une situation inhabituelle dans laquelle j'ai besoin d'un travail de minuteur SharePoint pour avoir des privilèges d'administrateur local et avoir des privilèges SharePoint SHAREPOINT\System.Sharepoint: exécution de stsadm à partir d'un travail de minuteur + SHAREPOINT Droits système

Je peux obtenir les privilèges de Windows en configurant simplement le service de minuterie pour utiliser un compte qui est membre des administrateurs locaux. Je comprends que ce n'est pas une bonne solution car cela donne au service de minuterie SharePoint plus de droits que ce qu'il est censé avoir. Mais cela permet au moins à mon travail de minuteur SharePoint de s'exécuter stsadm.

Un autre problème lié à l'exécution du service de minuteur sous un administrateur local est que cet utilisateur n'aura pas nécessairement les privilèges SHAREPOINT\System SharePoint dont j'ai également besoin pour ce travail SharePoint. Il s'avère que SPSecurity.RunWithElevatedPrivileges ne fonctionnera pas dans ce cas. Le réflecteur montre que RunWithElevatedPrivileges vérifie si le processus en cours est owstimer (le processus de service qui exécute les travaux SharePoint) et n'effectue aucune élévation c'est le cas (le rationnel ici, je suppose, est que le service de minuterie est censé fonctionner sous le compte Windows NT AUTHORITY\NetworkService qui a SHAREPOINT\System privilèges SharePoint, et donc il n'est pas nécessaire d'élever les privilèges pour un travail du minuteur). La seule solution possible ici semble être d'exécuter le service de minuteur sous son compte habituel NetworkService Windows et d'exécuter stsadm en tant qu'administrateur local en stockant les informations d'identification de l'administrateur quelque part et en les passant à System.Diagnostics.Process.Run() par le nom d'utilisateur, le domaine et le mot de passe de StarInfo.

Il semble que tout devrait fonctionner maintenant, mais voici un autre problème que je suis coincé pour le moment. Stsamd échoue avec la fenêtre d'erreur suivant (Winternals filemon montre que stsadm est en cours d'exécution sous l'administrateur dans ce cas) (!):

The application failed to initialize properly (0x0c0000142).
Click OK to terminate the application.

Observateur d'événements enregistre rien, sauf la fenêtre contextuelle.

L'utilisateur administrateur local est mon compte et quand je viens d'exécuter stsadm interactivement sous ce compte tout est ok. Cela fonctionne également très bien lorsque je configure le service de minuteur pour qu'il fonctionne avec ce compte.

Toutes les suggestions sont appréciés :)

Répondre

1

Je ne suis pas au travail en est ainsi du haut de ma tête, mais: Si vous obtenez une référence au site, vous pouvez essayer de créer une nouvelle SPSite avec le SYSTEM-UserToken?

SPUserToken sut = thisSite.RootWeb.AllUsers["SHAREPOINT\SYSTEM"].UserToken; 

using (SPSite syssite = new SPSite(thisSite.Url,sut) 
{ 
    // Do what you have to do 
} 
0

D'autres applications si elles sont exécutées de cette façon (à savoir à partir d'un travail de minuteur avec des informations d'identification explicites) ne parviennent pas même avec « L'application n'a pas pu initialiser propely ». Je viens juste d'utiliser une application simple qui prend le chemin d'un autre exécutable et de ses arguments en tant que paramètres et qui, une fois exécuté à partir de ce travail du minuteur, échoue de la même manière.

internal class ExternalProcess 
{ 
    public static void run(String executablePath, String workingDirectory, String programArguments, String domain, String userName, 
          String password, out Int32 exitCode, out String output) 
    { 
     Process process = new Process(); 

     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.RedirectStandardError = true; 
     process.StartInfo.RedirectStandardOutput = true; 

     StringBuilder outputString = new StringBuilder(); 
     Object synchObj = new object(); 

     DataReceivedEventHandler outputAppender = 
      delegate(Object sender, DataReceivedEventArgs args) 
       { 
        lock (synchObj) 
        { 
         outputString.AppendLine(args.Data); 
        } 
       }; 

     process.OutputDataReceived += outputAppender; 
     process.ErrorDataReceived += outputAppender; 

     process.StartInfo.FileName = @"C:\AppRunner.exe"; 
     process.StartInfo.WorkingDirectory = workingDirectory; 
     process.StartInfo.Arguments = @"""" + executablePath + @""" " + programArguments; 

     process.StartInfo.UserName = userName; 
     process.StartInfo.Domain = domain; 
     SecureString passwordString = new SecureString(); 

     foreach (Char c in password) 
     { 
      passwordString.AppendChar(c); 
     } 

     process.StartInfo.Password = passwordString; 

     process.Start(); 

     process.BeginOutputReadLine(); 
     process.BeginErrorReadLine(); 

     process.WaitForExit(); 

     exitCode = process.ExitCode; 
     output = outputString.ToString(); 
    } 
} 

AppRunner fait essentiellement le même que le fragment ci-dessus, mais sans nom d'utilisateur et mot de passe

0

Les travaux du minuteur SharePoint fonctionne avec les informations d'identification SharePoint entreprise Administrateur depuis, les informations entrer dans la base de données de configuration SharePoint. Ainsi, le pool d'applications n'aura pas l'accès.

Pour tester le travail du minuteur dans l'environnement de développement, nous pouvons temporairement modifier le compte du pool d'applications au compte du pool d'applications utilisé pour l'Administration centrale.