SharePoint 객체 모델을 통해 관리되는 경로를 만드는 방법
-
20-08-2019 - |
문제
이것은 WSS/SharePoint 전문가에 대한 질문입니다.
이 시나리오를 고려하십시오. 회사 CRM 시스템과 WSS 기반 인트라넷을 연결하는 ASP.NET 웹 서비스가 있습니다. 내가하려는 것은 새로운 클라이언트가 CRM 시스템에 추가 될 때마다 새로운 WSS 사이트 컬렉션을 제공하는 것입니다. 이 작업을 수행하려면 새로운 사이트 컬렉션에 관리되는 경로를 프로그래밍 방식으로 추가해야합니다. 나는 이것이 객체 모델을 통해 가능하다는 것을 알고 있지만, 내 웹 서비스에서 시도하면 실패합니다. 아래 샘플 코드 추출 :
Dim _ClientSiteUrl As String = "http://myintranet/clients/sampleclient"
Using _RootWeb As SPSite = New SPSite("http://myintranet")
Dim _ManagedPaths As SPPrefixCollection = _RootWeb.WebApplication.Prefixes
If Not (_ManagedPaths.Contains(_ClientSiteUrl)) Then
_ManagedPaths.Add(_ClientSiteUrl, SPPrefixType.ExplicitInclusion)
End If
End Using
이 코드는 spitility.validateformDigest ()에 대한 nullReferenceException으로 실패합니다. 연구에 따르면 이것은 불충분 한 권한으로 인한 것일 수 있다고 제안했으며, SPSECURITY.RUNWITHELEVATEDPRIVILEGES (AddrendEvmanagedPath)를 사용하여 높은 권한 블록 내에서 코드를 실행하려고 시도했습니다.
그런 다음 InvalidoPerationException으로 실패합니다. "현재의 상태로 인해 작동이 유효하지 않습니다."
내가 어디로 잘못 가고 있습니까?
내가 관리 한 한 가지 해결 방법은 Process.Start ()를 통해 STSADM.Exe로 호출하여 필수 매개 변수를 제공하는 것입니다.
업데이트: 웹 서비스를 개발하는 동안 내장 Visual Studio 2005 웹 서버를 사용하여 실행 중입니다. web.config에 항목을 넣어 보안 컨텍스트를 변경할 수 있습니까?
업데이트: 문제는 올바른 SharePoint 보안 컨텍스트 내에서 웹 서비스를 실행하지 않는 것과 관련이 있다고 생각합니다. 나는 내가 제안한 해결 방법을 가지고 가서 STSADM으로 가기로 결정했지만,이를 수행하기 위해서는 웹 서비스가 실행되는 애플리케이션 풀 ID가 SharePoint 관리자의 구성원이어야합니다.
해결책
업데이트나는 당신이 문제가 코드와 관련이 없다는 것을 증명했다고 생각합니다.
spsecurity.runwithelevatedPrivileges : 일반적으로 SharePoint 웹 응용 프로그램의 코드는 작업을 수행하는 사용자의 권한을 실행합니다. runwithelevatedPrivileges는 SharePoint 웹 애플리케이션 풀 계정의 맥락에서 코드를 실행합니다. MSDN 세부 사항으로 조금 더 들어갈 수 있습니다.
통화의 문제는 웹 서비스가 실제로 SharePoint 프로세스 내에서 코드를 실행하지 않으므로 왜 IT가 상승 할 수 없는지 설명합니다 (Wild Berson Alert).
웹 서비스 애플리케이션 풀의 사용자를 변경하는 데 균열이 생겨서 기쁨이 있는지 확인하십시오.
허가 문제 일 가능성이 높습니다. 시도해 볼 수 있습니다 :
Dim clientSiteUrl As String = "http://myintranet/clients/sampleclient"
Using SPSite = new SPSite(clientSiteUrl)
webApp As SPWebApplication = SPWebApplication.Lookup(new Uri(clientSiteUrl));
If Not (webApp.Prefixes.Contains(clientSiteUrl)) Then
webApp.Prefixes.Add(clientSiteUrl, SPPrefixType.ExplicitInclusion)
End If
End Using
이것은 정확한 코드가 아닙니다.
다른 팁
위의 코드는 정확한 코드가 아니기 때문에 기능 활성화 된 이벤트에서 웹 애플리케이션 스코핑 기능에 대한 정확한 작업 코드가 있습니다.
Mange Web Application 기능 페이지에서 기능 활성화에서 Activate 기능은 지정된 웹 애플리케이션에서 새로운 명시 적 관리 경로를 만듭니다 (하드 코딩을 Properties.feature.peature, 또는 유사한 것으로 바꾸려고합니다.)
using (SPSite site = new SPSite("http://dev-moss07-eric/PathHere")) {
SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric"));
if (webApp.Prefixes.Contains("PathHere"))
{
//
}
else
{
webApp.Prefixes.Add("PathHere", SPPrefixType.ExplicitInclusion);
}
}
코드는 아마도 개선 될 수 있지만 위의 코드를 변환하려는 시도가 있습니다.
해당 경로에서 관리되는 경로 (명시 적) 및 사이트 컬렉션을 만들려면 다음을 수행하십시오.
using (SPSite site = new SPSite("http://dev-moss07-eric")) {
SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric"));
if (webApp.Prefixes.Contains("ManagedPathHere"))
{
//
}
else
{
webApp.Prefixes.Add("ManagedPathHere", SPPrefixType.ExplicitInclusion);
}
using (SPWeb web = site.OpenWeb())
{
SPWebApplication webApplication = web.Site.WebApplication;
try
{
webApplication.Sites.Add("ManagedPathHere","Site Title Here","This site is used for hosting styling assets.", 1033, "STS#1", "6scdev\\eric.schrader", "Eric Schrader", "eric.schrader@6sc.com");
}
catch (Exception ex)
{
//ex.ToString;
}
}
}