Pregunta

Tengo una situación inusual en la que necesito un trabajo de temporizador de SharePoint que ambos tienen de administrador local y privilegios de windows para tener SHAREPOINT\System SharePoint privilegios.

Puedo obtener los privilegios de windows con sólo configurar el servicio de temporizador para utilizar una cuenta que es miembro de los administradores locales.Entiendo que esta no es una buena solución ya que da servicio de temporizador de SharePoint más derechos, entonces se supone que tiene.Pero al menos permite mi trabajo de temporizador de SharePoint para ejecutar stsadm.

Otro problema con el funcionamiento del temporizador de servicio en virtud de administrador local es que este usuario no necesariamente tienen SHAREPOINT\System SharePoint privilegios que necesito para este SharePoint trabajo.Resulta que SPSecurity.RunWithElevatedPrivileges no funciona en este caso.Reflector muestra que RunWithElevatedPrivileges comprueba si el proceso actual es owstimer (el proceso de servicio que ejecuta los trabajos de SharePoint) y no se realiza ningún tipo de elevación este es el caso (el racional aquí, supongo, es que el servicio de temporizador se supone que se ejecuta bajo NT AUTHORITY\NetworkService windows cuenta de que lo que ha SHAREPOINT\System SharePoint privilegios, y por lo tanto no hay necesidad de elevar privilegios para un trabajo del temporizador).

La única solución posible en este caso parece ser para ejecutar el servicio de temporizador de debajo de su nivel habitual de NetworkService cuenta de windows y ejecutar stsadm como administrador local mediante el almacenamiento de las credenciales de administrador en algún lugar y pasar al Sistema.Los diagnósticos.Proceso.Run() a través de la StarInfo del nombre de Usuario, dominio y contraseña.

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

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

El Visor de sucesos registra nada excepto la ventana emergente.

El administrador local de usuario de mi cuenta y cuando acabo de correr stsadm de forma interactiva en virtud de esta cuenta de que todo está bien.También funciona bien cuando puedo configurar el temporizador de servicio para que se ejecute en virtud de esta cuenta.

Cualquier sugerencias se agradecen :)

No hay solución correcta

Otros consejos

Yo no estoy en el trabajo así que esta es la parte superior de mi cabeza, pero:Si usted recibe una referencia al Sitio, puede intentar crear un nuevo SPSite con el SISTEMA UserToken?

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

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

Los trabajos del Temporizador de SharePoint se ejecuta con el SharePoint Empresa credenciales de Administrador, ya que, la información que entrar en la configuración de SharePoint de la Base de datos.Por lo tanto el grupo de aplicaciones no tienen acceso.

Para probar el trabajo del temporizador en el entorno dev, podemos cambiar temporalmente la cuenta del grupo de aplicaciones para la cuenta de grupo de aplicaciones se utilizan para la Administración Central.

Otras aplicaciones si se ejecuta de esta forma (es decir,a partir de un trabajo del temporizador con credenciales explícitas) están fallando, de la misma manera con "La aplicación no se pudo inicializar propely".Acabo de worte de una aplicación simple que toma una ruta de acceso de otro ejecutable y sus argumentos como parameres y cuando se ejecuta a partir de que el trabajo del temporizador de 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 anterior fragmento, pero sin nombre de usuario y contraseña

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top