Sharepoint: выполнение stsadm из задания таймера + SHAREPOINT \ Системные права

У меня необычная ситуация, когда мне нужно задание таймера SharePoint, чтобы иметь права локального администратора Windows и права SHAREPOINT\System SharePoint.

Я могу получить привилегии Windows, просто настроив службу таймера для использования учетной записи, которая является членом локальных администраторов. Я понимаю, что это не очень хорошее решение, поскольку оно дает службе таймера SharePoint больше прав, чем предполагалось. Но это, по крайней мере, позволяет запускать мое задание таймера SharePoint stsadm .

Другая проблема с запуском службы таймера под локальным администратором заключается в том, что этот пользователь не обязательно будет иметь SHAREPOINT\System права SharePoint, которые мне также нужны для этого задания SharePoint. Оказывается, SPSecurity.RunWithElevatedPrivileges в этом случае это не сработает. Reflector показывает, что RunWithElevatedPrivileges проверяет, является ли текущий процесс owstimer (процесс службы, который запускает задания SharePoint), и не выполняет никаких повышений в этом случае (рациональным здесь, я полагаю, является то, что служба таймера должна запускаться под NT AUTHORITY\NetworkService учетной записью Windows, которая имеет SHAREPOINT\System SharePoint привилегии, и, следовательно, нет необходимости повышать привилегии для задания таймера).

Единственное возможное решение здесь - запустить службу таймера под своей обычной учетной записью Windows NetworkService и запустить stsadm от имени локального администратора, сохранив где-нибудь учетные данные администратора и передав их в System.Diagnostics.Process.Run () через имя пользователя StarInfo. , домен и пароль.

Кажется, теперь все должно работать, но вот еще одна проблема, с которой я застрял в данный момент. Stsamd не работает со следующим всплывающим окном (!) (Winternals filemon показывает, что в этом случае stsadm работает под администратором):

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

Средство просмотра событий ничего не регистрирует, кроме всплывающего окна.

Моя учетная запись - это локальный администратор, и когда я просто запускаю в stsadm интерактивном режиме под этой учетной записью, все в порядке. Он также отлично работает, когда я настраиваю службу таймера для работы под этой учетной записью.

Любые предложения приветствуются :)

Ответов (3)

Я не на работе, так что это не в моей голове, но: если вы получите ссылку на сайт, можете ли вы попробовать создать новый SPSite с помощью SYSTEM-UserToken?

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

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

Другие приложения, если они запускаются таким образом (например, из задания таймера с явными учетными данными), не работают точно так же, как «Приложению не удалось инициализировать должным образом». Я просто использовал простое приложение, которое принимает путь к другому исполняемому файлу и его аргументы в качестве параметров, и при запуске из этого задания таймера оно не работает точно так же.

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 в основном делает то же, что и приведенный выше фрагмент, но без имени пользователя и пароля.

Задания таймера SharePoint выполняются с учетными данными администратора фирмы SharePoint, поскольку информация попадает в базу данных конфигурации SharePoint. Таким образом, пул приложений не будет иметь доступа.

Для тестирования задания таймера в среде разработки мы можем временно изменить учетную запись пула приложений на учетную запись пула приложений, используемую для центра администрирования.