コードから他のマシンの共有リソースにアクセスしたい。私の環境は、クレーム認証モードで動作する Sharepoint 2010 WebApplication です。アプリケーションの Windows ID は NT AUTHORITY\IUSR です。ログインしたユーザーではないため、他のマシンのネット共有リソースにアクセスするには、偽装を実行する必要があります。偽装を実行するための有効な Windows トークンがないため、NT AUTHORITY\IUSR からアクセスできるように構成した Claims To Windows Token Service を使用する必要があります。サービスはローカル システム アカウントとして実行されています。次のコードを使用して、偽装を実行するために使用しているサービスから、偽装レベルの Windows トークンを取得できます。
using (wi = S4UClient.UpnLogon(upn))
{
using(WindowsImpersonationContext wic2 = wi.Impersonate())
{
//code to access windows shares
}
}
サービスは適切にトークンを返し、次のコードを使用して現在ログインしているユーザーの ID を返すと、偽装が成功します。
WindowsIdentity.GetCurrent().Name;
sharepoint にログインしているユーザーのユーザー名を取得しています。
問題は、ネットワーク リソースにアクセスしようとすると、「アクセスが拒否されました」というエラーが発生することです。次のコードを使用してユーザーを偽装するために実際の資格情報 (ログインとパスワード) を提供しているため、c2wts を介した偽装のため、問題は確実です。
[DllImport("advapi32.dll", SetLastError = true)]
private static extern Int32 LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, Int32 dwLogonType, Int32 dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern Int32 ImpersonateLoggedOnUser(IntPtr hToken);
private static IntPtr ImpersonateUser(string user, string domain, string password)
{
IntPtr lnToken = new IntPtr(0);
Int32 TResult = LogonUser(user, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_WINNT50, ref lnToken);
if (TResult > 0)
{
ImpersonateLoggedOnUser(lnToken);
}
return lnToken;
}
サーバー上の共有を問題なく列挙できます。
インターネットで見つけた情報から、サービスを適切に構成して別のサーバー上の sql データベースにアクセスするには、Active Directory でプロトコル遷移と制約付き委任を有効にし、その制約を mysql サービスに設定する必要があります。私が達成しようとしているのは、ユーザーのみがアクセス許可を持っている場合に、任意のマシン上の任意の共有にアクセスできるようにすることであるため、この場合に委任を有効にする方法はまだわかりません。
要約すると、Sharepoint Claims Based Authentication WebApplication 内からユーザーを偽装して、他のコンピューターのネット共有にアクセスしたいのですが、c2wts を使用した厳しい偽装でも成功しているようです (現在のユーザー名を確認すると、正しいユーザー名が返されます) アクセスできません他のコンピューター上のリソース。一方、コードで直接提供されたログインとパスワードを使用して偽装すると、すべて正常に機能しますが、それは私にとってオプションではありません。