2008-08-06 12 views
6

Tengo una situación inusual en la que necesito un trabajo de temporizador de SharePoint para tener privilegios de administrador de Windows locales y tener privilegios de SharePoint SHAREPOINT\System.Sharepoint: ejecutando stsadm desde un trabajo de temporizador + SHAREPOINT Derechos del sistema

Puedo obtener los privilegios de Windows simplemente configurando el servicio del temporizador para usar una cuenta que es miembro de los administradores locales. Entiendo que esta no es una buena solución, ya que le da al servicio de temporizador de SharePoint más derechos de los que se supone que tiene. Pero al menos permite que mi trabajo del temporizador de SharePoint se ejecute stsadm.

Otro problema con la ejecución del servicio de temporizador bajo el administrador local es que este usuario no tendrá necesariamente los privilegios de SharePoint SHAREPOINT\System que también necesito para este trabajo de SharePoint. Resulta que SPSecurity.RunWithElevatedPrivileges no funcionará en este caso. El reflector muestra que RunWithElevatedPrivileges comprueba si el proceso actual es owstimer (el proceso de servicio que ejecuta trabajos de SharePoint) y no realiza ninguna elevación este es el caso (el racional aquí, supongo, es que el servicio de temporizador se debe ejecutar bajo NT AUTHORITY\NetworkService cuenta de Windows que que tiene SHAREPOINT\System privilegios de SharePoint, y por lo tanto no hay necesidad de elevar los privilegios para un trabajo del temporizador).

La única solución posible aquí parece ser ejecutar el servicio de temporizador en su cuenta de windows NetworkService habitual y ejecutar stsadm como administrador local almacenando las credenciales de administrador en algún lugar y pasándolas a System.Diagnostics.Process.Run() a través del nombre de usuario, dominio y contraseña de StarInfo.

Parece que todo debería funcionar ahora, pero aquí hay otro problema al que estoy atascado en este momento. Stsamd está fallando con la siguiente ventana emergente de error (Winternals Filemon muestra que stsadm se ejecuta en el administrador en este caso) (!):

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

Visor de sucesos registra nada, excepto la ventana emergente.

El usuario administrador local es mi cuenta y cuando acabo de ejecutar stsadm interactivamente bajo esta cuenta todo está bien. También funciona bien cuando configuro el servicio del temporizador para que se ejecute en esta cuenta.

Se aprecia cualquier sugerencia :)

Respuesta

1

yo no estoy en el trabajo por lo que esta es la parte superior de la cabeza, pero: Si obtiene una referencia al sitio, se puede tratar de crear un nuevo SPSite con el 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

Otras aplicaciones si se ejecuta de esta manera (es decir, desde un trabajo del temporizador con credenciales explícitas) están fallando la misma manera con "La aplicación no se pudo inicializar propely". Acabo de crear una aplicación simple que toma la ruta de otro ejecutable y sus argumentos como parámetros y cuando se ejecuta desde ese trabajo del temporizador falla de la misma manera.

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 básicamente hace lo mismo que el fragmento anterior, pero sin nombre y contraseña

0

Los trabajos de temporizador de SharePoint se ejecuta con las credenciales de administrador de SharePoint firme, ya que, la información entrar en la base de datos de SharePoint Config. Por lo tanto, el grupo de aplicaciones no tendrá acceso.

Para probar el trabajo del temporizador en el entorno de desarrollo, podemos cambiar temporalmente la cuenta del grupo de aplicaciones a la cuenta del grupo de aplicaciones que se utiliza para Administración central.

Cuestiones relacionadas