заявление об отказе от ответственности: я никогда действительно не перешел из php.
Оказывается, вы можете выполнять имитированный поиск в SharePoint без пароля. Мы выяснили это еще в августе 2009 года, и я упустил возможность обновить Stack Overflow ответом.
Подробнее см. http://wiki.threewill.com/display/is/2010/06/18/Connect+to+SharePoint+-+Forwarding+User+Identities . Обратите особое внимание на особые требования. Обратите внимание, что это работает как с SharePoint 2007, так и с SharePoint 2010.
Большое спасибо моему коллеге Эрику Боудену, который проделал всю работу!
Для этого вам потребуется настоящее олицетворение Windows. Олицетворение SPSite не является реальным олицетворением - оно просто указывает объектной модели WSS записать другой идентификатор пользователя в созданные и измененные поля в базе данных контента.
Для олицетворения Windows вам, к сожалению, потребуются и логин, и пароль, если вы не хотите олицетворять учетную запись пула приложений с помощью SPSecurity.RunWithElevatedPrivileges
. Вы можете реализовать олицетворение Windows следующим образом:
using (Impersonator imp = new Impersonator("user", "domain", "password"))
{
// Do stuff impersonated
}
где класс Impersonator - реализовано как:
public sealed class Impersonator : IDisposable
{
private WindowsImpersonationContext impersonationContext;
public Impersonator(string user, string domain, string password)
{
WindowsIdentity id = Logon(user, domain, password);
impersonationContext = id.Impersonate();
}
public void Dispose()
{
if (impersonationContext != null)
{
impersonationContext.Undo();
impersonationContext = null;
}
}
private WindowsIdentity Logon(string user, string domain, string password)
{
WindowsIdentity identity;
IntPtr handle = IntPtr.Zero;
bool logonSucceeded = LogonUser(
user, domain, password,
8, // LOGON32_LOGON_NETWORK_CLEARTEXT
0, // LOGON32_PROVIDER_DEFAULT
ref handle);
if (!logonSucceeded)
{
int errorCode = Marshal.GetLastWin32Error();
throw new UnauthorizedAccessException("User logon failed. Error Number: " + errorCode);
}
identity = new WindowsIdentity(handle);
CloseHandle(handle);
return identity;
}
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool LogonUser(string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);
}