Sharepoint: выполнение stsadm из задания таймера + SHAREPOINT \ Системные права - PullRequest
7 голосов
/ 06 августа 2008

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 06 августа 2008

Я не на работе, поэтому это не в моей голове, но: если вы получаете ссылку на сайт, можете ли вы попытаться создать новый 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
}
0 голосов
/ 09 мая 2011

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

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

0 голосов
/ 07 августа 2008

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

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

...