2008-08-06 11 views
6

Ich habe eine ungewöhnliche Situation, in der ich einen SharePoint-Timer-Job sowohl lokale Administrator Windows-Berechtigungen und SHAREPOINT\System SharePoint-Berechtigungen benötigen.Sharepoint: Ausführen von Stsadm von einem Timer-Job + SHAREPOINT Systemrechte

Ich kann die Windows-Berechtigungen erhalten, indem ich einfach den Timer-Dienst für die Verwendung eines Kontos konfigurieren, das ein Mitglied der lokalen Administratoren ist. Ich verstehe, dass dies keine gute Lösung ist, da es dem SharePoint-Zeitdienst mehr Rechte gibt, als er eigentlich haben sollte. Aber es lässt zumindest zu, dass mein SharePoint-Zeitgeberauftrag stsadm ausgeführt wird.

Ein weiteres Problem beim Ausführen des Timer-Diensts unter lokalen Administrator ist, dass dieser Benutzer nicht unbedingt SHAREPOINT\System SharePoint-Berechtigungen, die ich auch für diesen SharePoint-Job benötigen. Es stellt sich heraus, dass SPSecurity.RunWithElevatedPrivileges in diesem Fall nicht funktioniert. Reflektor zeigt, dass RunWithElevatedPrivileges überprüft, ob der aktuelle Prozess owstimer ist (der Service-Prozess, der SharePoint-Jobs ausführt) und führt keine Erhöhung ist dies der Fall (die rationale hier, ich denke, ist, dass der Timer-Dienst unter NT AUTHORITY\NetworkService Windows-Konto ausgeführt werden soll Das hat SHAREPOINT\System SharePoint-Berechtigungen, und daher müssen die Berechtigungen für einen Zeitgeberauftrag nicht erhöht werden).

Die einzige mögliche Lösung scheint hier zu sein, den Zeitgeberdienst unter seinem üblichen NetworkService-Windows-Konto auszuführen und stsadm als lokalen Administrator auszuführen, indem die Administratoranmeldeinformationen irgendwo gespeichert und an System.Diagnostics.Process.Run() übergeben werden. durch den Benutzernamen, die Domain und das Passwort von StarInfo.

Es scheint alles sollte jetzt funktionieren, aber hier ist ein anderes Problem, mit dem ich im Moment festhalte. Stsamd versagt mit dem folgenden Fehler Popup (Winternals filemon zeigt, dass stsadm wird in diesem Fall unter dem Administrator ausgeführt wird) (!):

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

Ereignisanzeige registriert nichts außer dem Popup.

Der lokale Administrator Benutzer ist mein Konto und wenn ich gerade stsadm interaktiv unter diesem Konto ausführen, ist alles in Ordnung. Es funktioniert auch gut, wenn ich den Timer-Dienst für die Ausführung unter diesem Konto konfiguriere.

Alle Vorschläge sind willkommen :)

Antwort

1

Ich bin nicht bei der Arbeit, so ist dies aus der Spitze von meinem Kopf, aber: Wenn Sie einen Verweis auf die Website erhalten, können Sie versuchen, ein neues SPSite zu schaffen, mit das 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

Andere Anwendungen, wenn auf diese Weise ausgeführt werden (das heißt von einem Timer Job mit expliziten Anmeldeinformationen) werden auf die gleiche Art und Weise versagt mit „Die Anwendung konnte nicht propely initialisiert werden“. Ich habe einfach eine einfache App geschrieben, die den Pfad einer anderen ausführbaren Datei und ihrer Argumente als Parameter verwendet. Wenn sie von diesem Timer-Job ausgeführt wird, schlägt sie auf die gleiche Weise fehl.

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 tut im Grunde das gleiche wie das obige Fragment, aber ohne Benutzername und Passwort

0

Die Jobs Sharepoint Timer läuft mit den Sharepoint-Firma Admin-Anmeldeinformationen, da die Informationen in die Datenbank Sharepoint Config erhalten. Daher hat der Anwendungspool keinen Zugriff.

Zum Testen des Zeitgeberauftrags in der Entwicklungsumgebung können wir das Anwendungspoolkonto vorübergehend in das Anwendungspoolkonto ändern, das für die Zentraladministration verwendet wird.