Наконец, проблема с отказом в доступе была решена.Как я указывал в своем предыдущем электронном письме, проблема была связана с недостаточным разрешением для идентификатора пула приложений.
- Центральный администратор работал под другим идентификатором пула приложений
- Веб-приложения работаютпод другим идентификатором пула приложений.
Мой рабочий процесс использовал ElevatedPrevilages для предоставления семейства сайтов, и он получал отказ в доступе из базы данных, поскольку у него не было разрешения изменять базу данных SharePoint_Config.
Решение Чтобы решить эту проблему, мне пришлось выдать себя за идентификатор пула приложений Центрального администратора.Вот обязательный метод для олицетворения пользователя пула приложений Central Admin.
#region Application Pool Identity Impersonate
protected static WindowsIdentity CreateIdentity(string User, string Domain, string Password)
{
// The Windows NT user token.
IntPtr tokenHandle = new IntPtr(0);
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_NETWORK = 3;
tokenHandle = IntPtr.Zero;
// Call LogonUser to obtain a handle to an access token.
int returnValue = LogonUser(User, Domain, Password,LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,out tokenHandle);
//Check if the logon user method succeeded
if (returnValue <= 0)
{
int ret = Marshal.GetLastWin32Error();
throw new Exception("LogonUser failed with error code: " + ret);
}
//System.Diagnostics.Debug.WriteLine("Created user token: " + tokenHandle);
//The WindowsIdentity class makes a new copy of the token.
//It also handles calling CloseHandle for the copy.
WindowsIdentity id = new WindowsIdentity(tokenHandle);
CloseHandle(tokenHandle);
return id;
}
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken
);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int ImpersonateLoggedOnUser(
IntPtr hToken
);
[DllImport("advapi32.dll", SetLastError = true)]
static extern int RevertToSelf();
[DllImport("kernel32.dll", SetLastError = true)]
static extern int CloseHandle(IntPtr hObject);
#endregion
И тогда мой код для создания семейства сайтов выглядит так: -
//Impersonate the logged in user, ApplicationUser, LoginDomain and Password are exposed as property of the class.
WindowsImpersonationContext wiContext = CreateIdentity(this.ApplicationPoolUser, this.LoginDomain, this.SystemPassword).Impersonate();
//Provision new site collection and update the property for new site collection url.
using (SPSite newSiteCollection = spSiteColl.Add(SUGGESTEDURL, TITLE, DESC, LCID, WEBTEMPLATE, PRIMARYOWNER.LoginName, PRIMARYOWNER.Name, PRIMARYOWNER.Email, SECONDARYOWNER.LoginName, SECONDARYOWNER.Name, SECONDARYOWNER.Email))
{
this.SUGGESTEDURL = newSiteCollection.Url;
}
//Reset the impersonation.
wiContext.Undo();