2008-08-06 8 views
6

Mam nietypową sytuację, w której potrzebuję zadania timera SharePoint, aby mieć uprawnienia lokalnego administratora Windows i mieć uprawnienia SharePoint z SHAREPOINT\System.SharePoint: wykonywanie stsadm z zadania timera + SHAREPOINT System rights

Mogę uzyskać uprawnienia do systemu Windows, po prostu konfigurując usługę licznika czasu do korzystania z konta będącego członkiem lokalnych administratorów. Rozumiem, że nie jest to dobre rozwiązanie, ponieważ zapewnia usługę zegara SharePoint więcej praw niż powinien. Ale przynajmniej pozwala, aby moje zadanie timera SharePoint działało stsadm.

Kolejnym problemem związanym z uruchomieniem usługi licznika czasu przez administratora lokalnego jest to, że ten użytkownik niekoniecznie będzie mieć uprawnienia SharePoint, które również są wymagane dla tego zadania programu SharePoint. Okazuje się, że SPSecurity.RunWithElevatedPrivileges nie zadziała w tym przypadku. Odbłyśnik pokazuje, że bieżący proces to owstimer (proces serwisowy, który uruchamia zadania SharePoint) i nie wykonuje tego podniesienia (racjonalne tutaj, jak sądzę, jest to, że usługa zegara ma działać pod kontem Windows NT AUTHORITY\NetworkService który ma uprawnienia SharePoint, a zatem nie ma potrzeby podwyższania uprawnień dla zadania timera).

Jedynym możliwym rozwiązaniem wydaje się być uruchomienie usługi timera na zwykłym koncie Windows NetworkService i uruchomienie stsadm jako lokalnego administratora poprzez przechowywanie poświadczeń administratora i przekazywanie ich do System.Diagnostics.Process.Run() poprzez nazwę użytkownika StarInfo, domenę i hasło.

Wygląda na to, że wszystko powinno działać już teraz, ale tutaj jest inny problem, na który w tej chwili utknąłem. Stsamd się niepowodzeniem z następującym popup błędu (Winternals Filemon pokazuje, że stsadm pracuje pod administratora w tym przypadku) (!):

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

Podgląd zdarzeń rejestruje nic poza popup.

Użytkownik lokalnego administratora jest moim kontem i po uruchomieniu interaktywnie pod tym kontem wszystko jest w porządku. Działa również dobrze, gdy skonfiguruję usługę timera, aby działała pod tym kontem.

Wszelkie sugestie są mile widziane :)

Odpowiedz

1

nie jestem w pracy, więc jest to z góry na głowie, ale: Jeśli pojawi się odniesienie do miejsca, można spróbować utworzyć nowy SPSite z the 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

Inne zastosowania, jeśli uruchomić ten sposób (czyli z pracy timera z jawnych poświadczeń) nie udaje się tak samo z „Aplikacja nie została zainicjowana propely”. Właśnie wybrałem prostą aplikację, która przyjmuje ścieżkę innego pliku wykonywalnego, a jego argumenty jako parametry, a kiedy są uruchamiane z tego zadania timera, nie działa w ten sam sposób.

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 zasadzie robi to samo jak w powyższym fragmencie, ale bez nazwy użytkownika i hasła

0

Zadania SharePoint skończy z poświadczeniami SharePoint Kancelaria administratora, ponieważ informacja dostać do bazy danych SharePoint Config. W ten sposób pula aplikacji nie będzie miała dostępu.

Aby przetestować zadanie czasomierza w środowisku dewelopera, możemy tymczasowo zmienić konto puli aplikacji na konto puli aplikacji używane do administracji centralnej.

Powiązane problemy