2009-06-22 3 views
6

私は過去にSharePointで偽装を行ってきましたが、これは次のようなことです。パスワードを入力せずにSharePointで偽装検索を実行できますか?

SPWeb web = SPContext.Current.Web; 
string currentWebUrl = web.Url; 
SPUser user = web.EnsureUser(loginToImpersonate); 
using (SPSite site = new SPSite(currentWebUrl, user.UserToken) 
{ 
    using (SPWeb impersonatedWeb = site.OpenWeb()) 
    { 
     // Any SharePoint access here to 'impersonatedWeb' 
     // is impersonated as 'loginToImpersonate' 
    } 
} 

偽装するユーザーのパスワードは必要ありませんが、実行するには特定のコードアクセスセキュリティが必要です。さらに、EnsureUserコールでは、現在のユーザーが管理者である必要がありますが、SPUserオブジェクトを取得するためにEnsureUserの代わりに使用できる他のメソッドがあります。

これでステージを設定しました...今、MOSSまたはWSSクエリエンジンに対してFullTextSQLQueryまたはKeywordQueryを実行し、偽装されたユーザーに基づいてセキュリティトリミング結果を取得します。どちらのオブジェクトもコンストラクタでSPSiteを使用できますが、私の偽装ロジックは無視されます。代わりに、現在ログインしているユーザー(HTTPContext.Current.User)と一緒に移動します。

他のコンストラクタもあります:アプリケーション名(文字列)、MOSSにはSSPへのServerContextがありますが、これらはまったく役に立ちません。

ReflectorをKeywordQueryクラスとその基本Queryクラスで使用しましたが、かなり醜いです。私は、ユーザーを決定する実際のロジックが管理されていないコードでダウンしていると考えています。

私はこれを行うことができますか?

+0

作業リンク:http://www.threewill.com/2010/06/connect-to-sharepoint-forwarding-user-identities/ – KjellSj

答えて

1

あなたはです。 nパスワードなしでSharePoint内で検索を偽装します。私たちは2009年の8月にこのことを考え出しました。私は答えでStack Overflowを更新することを諦めています。

詳細については、http://wiki.threewill.com/display/is/2010/06/18/Connect+to+SharePoint+-+Forwarding+User+Identitiesを参照し、特別な要件に特に注意してください。これはSharePoint 2007とSharePoint 2010の両方で機能することに注意してください。

すべての作業を担当した同僚のEric Bowdenに感謝します!

+2

リンクが壊れていますか? –

+0

ワーキングリンク:更新されたリンクを見つけるためのhttp://www.threewill.com/2010/06/connect-to-sharepoint-forwarding-user-identities/ –

+0

感謝。私は自分がどこだったのか分からなかった!私はこの記事に帰ってくるので –

4

これを行うには、実際のWindows偽装が必要です。 SPSiteの偽装は実際の偽装ではなく、コンテンツデータベースの作成されたフィールドと変更されたフィールドに別のユーザーIDを書き込むようにWSSオブジェクトモデルに指示します。 Windowsの偽装については

あなたは、残念ながらあなたがSPSecurity.RunWithElevatedPrivileges

を使用して、アプリケーションプールアカウントを偽装する場合を除き、次のようにあなたは、Windowsの偽装を実装することができますログイン名とパスワードの両方が必要になります。

using (Impersonator imp = new Impersonator("user", "domain", "password")) 
{ 
    // Do stuff impersonated 
} 

偽装クラスを

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); 
} 
+1

ありがとう、ラース。私が聞きたかった答えではありませんが、私の選択肢が何であるか知ることは良いことです。私はImpersonatorクラスに感謝します。それはいいね。 –

+0

良かったLars、これに感謝します。 –

0

実際には、オブジェクトモデルを使用して検索を実行するときに偽装を実行する別の方法があります。私は、昇格した特権で走っているときになりすましをすることによって、それを働かせることができました。ここに私の記事を見てください:http://vishalseth.com/post/2013/11/05/Impersonated-Searching-against-SharePoint.aspx

+1

このリンクは質問に答えるかもしれないが、リンクが時間とともに減衰する傾向があるので、あなたは、記事を要約したり引用しなければなりません。 – pinckerman

関連する問題