2008-08-06 13 views
6

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

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

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

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

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

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

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

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

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

ответ

1

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

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

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

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

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