У меня необычная ситуация, когда мне нужно задание таймера 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 завершается ошибкой со следующим всплывающим сообщением об ошибке (!) (Winmonals filemon показывает, что в этом случае stsadm работает под администратором):
The application failed to initialize properly (0x0c0000142).
Click OK to terminate the application.
Event Viewer ничего не регистрирует, кроме всплывающего окна.
Пользователь локального администратора - это моя учетная запись, и когда я просто запускаю ее в stsadm
интерактивном режиме, все в порядке. Это также работает нормально, когда я настраиваю службу таймера для запуска под этой учетной записью.
Любые предложения приветствуются :)
Я не на работе, так что это не в моей голове, но: если вы получаете ссылку на сайт, можете ли вы попытаться создать новый 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. Таким образом, пул приложений не будет иметь доступа.
Для тестирования задания таймера в среде разработки мы можем временно изменить учетную запись пула приложений на учетную запись пула приложений, используемую для центра администрирования.