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

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

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

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

Event Viewer ничего не регистрирует, кроме всплывающего окна.

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

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

6.08.2008 17:27:19
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
}
1
22.02.2018 17:03:00

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

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

0
7.02.2016 17:42:18

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

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

0
22.11.2012 16:50:33