SharePoint: executar stsadm a partir de um trabalho de timer + SHAREPOINT \ direitos do sistema

votos
6

Eu tenho uma situação incomum em que eu preciso de um trabalho de timer do SharePoint para ambos têm privilégios do Windows administrador local e ter SHAREPOINT\Systemprivilégios SharePoint.

Posso obter os privilégios do Windows, basta configurar o serviço de timer para usar uma conta que é um membro de administradores locais. Eu entendo que isso não é uma boa solução, uma vez que dá SharePoint Service temporizador mais direitos, então é suposto ter. Mas pelo menos permite que o meu trabalho de timer do SharePoint para executar stsadm.

Outro problema com o funcionamento do serviço de timer sob administrador local é que esse usuário não terá necessariamente SHAREPOINT\Systemprivilégios SharePoint que também precisam para este trabalho SharePoint. Acontece que SPSecurity.RunWithElevatedPrivilegesnão vai funcionar neste caso. Refletor mostra que RunWithElevatedPrivilegesverifica se o processo atual é owstimer(o processo de serviço que executa trabalhos SharePoint) e não executa nenhuma elevação este for o caso (o racional aqui, eu acho, é que o serviço de timer é suposto para ser executado sob NT AUTHORITY\NetworkServiceo Windows conta que que tem SHAREPOINT\SystemSharePoint privilégios, e, portanto, não há necessidade de elevar privilégios para um trabalho de timer).

A única solução possível aqui parece ser para executar o serviço temporizador sob sua conta Windows NetworkService habituais e para executar stsadm como um administrador local, armazenando as credenciais de administrador em algum lugar e passá-los para System.Diagnostics.Process.Run () através Nome de usuário do StarInfo , domínio e senha.

Parece que tudo deve funcionar agora, mas aqui é outro problema que estou preso com no momento. Stsamd está falhando com o seguinte pop-up de erro (Winternals filemon mostra que stsadm é executado sob o administrador, neste caso) (!):

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

Visualizador de eventos registra nada, exceto o pop-up.

O usuário administrador local é a minha conta e quando eu apenas executar stsadminterativamente sob esta conta está tudo ok. Ele também funciona muito bem quando eu configurar o serviço de timer para executar sob esta conta.

Todas as sugestões são bem-vindas :)

Publicado 06/08/2008 em 18:27
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

Eu não estou no trabalho assim que este é fora do topo da minha cabeça, mas: Se você receber uma referência para o Site, você pode tentar criar um novo SPSite com o sistema de UserToken?

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

using (SPSite syssite = new SPSite(thisSite.Url,sut)
{
    // Do what you have to do
}
Respondeu 06/08/2008 em 18:31
fonte usuário

votos
0

Os trabalhos de timer do SharePoint é executado com as credenciais do SharePoint Empresa de administrador, pois, as informações entrar no banco de dados SharePoint configuração. Assim, o pool de aplicativos não terão o acesso.

Para testar o trabalho de timer no ambiente dev, podemos alterar temporariamente a conta do pool de aplicativos para a conta do pool de aplicativos que está sendo usado para a Administração Central.

Respondeu 09/05/2011 em 15:40
fonte usuário

votos
0

Outras aplicações se executar desta forma (ou seja, de um trabalho de timer com credenciais explícitas) não estão da mesma forma com "A aplicação falhou ao inicializar propely". Eu só worte um aplicativo simples que leva um caminho de outro executável e seus argumentos como parâmeros e quando executar a partir desse trabalho de timer ele falhar da mesma maneira.

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 basicamente faz o mesmo que o fragmento acima, mas sem nome de utilizador e palavra-passe

Respondeu 07/08/2008 em 11:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more