SharePoint: executarea stsadm dintr-o lucrare cronometru + drepturi SHAREPOINT \ System

Am o situație neobișnuită în care am nevoie de o lucrare de timer SharePoint pentru a avea atât privilegii de administrator pentru ferestre locale, cât și privilegii SHAREPOINT \ System SharePoint.

Pot obține privilegii de ferestre prin simpla configurare a serviciului de temporizare pentru a utiliza un cont care este membru al administratorilor locali. Înțeleg că nu este o soluție bună deoarece oferă serviciului de cronometrare SharePoint mai multe drepturi pe care trebuie să le aibă. Dar cel puțin permite jobului timerului SharePoint să ruleze stsadm .

O altă problemă în ceea ce privește rularea serviciului de temporizare în cadrul administratorului local este că acest utilizator nu va avea neapărat privilegii SHAREPOINT \ System SharePoint, de care am nevoie, de asemenea, pentru această lucrare SharePoint. Se pare că SPSecurity.RunWithElevatedPrivileges nu va funcționa în acest caz. Reflectorul arată că RunWithElevatedPrivileges verifică dacă procesul curent este owstimer (procesul de serviciu care execută lucrări SharePoint) și nu efectuează nici o altitudine în acest caz (rațional aici, este că serviciul temporizator ar trebui să ruleze în contul windows NT AUTHORITY \ NetworkService , care are privilegii SHAREPOINT \ System SharePoint și astfel nu este nevoie să ridice privilegiile pentru un cronometru loc de munca).

Singura soluție posibilă aici este să rulați serviciul de timer în cadrul contului său obișnuit de rețea NetworkService și să rulați stsadm ca administrator local, stocând acreditările administratorului undeva și trecându-le la System.Diagnostics.Process.Run() prin numele de utilizator StarInfo , domeniu și parolă.

Se pare că totul ar trebui să funcționeze acum, dar aici este o altă problemă cu care mă blochez în acest moment. Stsamd nu reușește cu următorul pop-up de eroare (!) (Fișierul Winternals arată că stsadm se execută sub administratorul în acest caz):

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

Event Viewer nu înregistrează nimic decât fereastra pop-up.

Utilizatorul de administrator local este contul meu și când rulez doar stsadm interactiv sub acest cont, totul este ok. De asemenea, funcționează bine atunci când configurez serviciul temporizator pentru a rula în acest cont.

Orice sugestii sunt apreciate :)

0
adăugat editat
Vizualizări: 4

3 răspunsuri

Nu sunt la locul de muncă, așa că este în afara capului meu, dar: Dacă primiți o referință la Site, puteți încerca să creați un nou SPS cu 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
adăugat

Alte aplicații, dacă se execută în acest fel (de exemplu, dintr-o lucrare de temporizare cu acreditări explicite), nu reușesc în același mod cu "Aplicația nu a inițializat propul". Mă îngrijorez doar o aplicație simplă, care ia o cale a altui executabil și argumentele sale ca parametri și atunci când este executată de acel proces temporizator, nu reușește același lucru.

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 practic face același lucru cu fragmentul de mai sus, dar fără nume de utilizator și parolă

0
adăugat

Activitățile Timer SharePoint rulează cu acreditările SharePoint Firm Admin deoarece informațiile intră în baza de date SharePoint Config. Astfel, grupul de aplicații nu va avea acces.

Pentru testarea lucrării cu temporizator în mediul dev, putem schimba temporar contul pool-ului de aplicații la contul pool-ului de aplicații utilizat pentru administrarea centrală.

0
adăugat