1

コードから他のマシンの共有リソースにアクセスしたい。私の環境は、クレーム認証モードで動作する 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 を使用した厳しい偽装でも成功しているようです (現在のユーザー名を確認すると、正しいユーザー名が返されます) アクセスできません他のコンピューター上のリソース。一方、コードで直接提供されたログインとパスワードを使用して偽装すると、すべて正常に機能しますが、それは私にとってオプションではありません。

4

1 に答える 1

1

わかりました私は実際にそれを解決することができました。

私がしたことは、webapplication の web.config で偽装を false に設定することでした:

<identity impersonate="false" />

その場合、ローカル共有上のファイルを見ることができました。他のコンピューターでアクセスできるようにするには、Web アプリケーションが実行されているアカウントのサービス プリンシパル名 (SPN) を作成する必要がありました。

SETSPN -A HTTP/ServerName myDomain\webAppAccountUserName
SETSPN -A HTTP/FQDNServerName myDomain\webAppAccountUserName

webapplication と c2wts (c2wts は LocalSystem として動作) が実行されていたコンピューターの SPN

SETSPN -A HOST/ServerName ServerName 
SETSPN -A HOST/FQDNServerName ServerName 

次のステップは、制約付き委任とプロトコル遷移を構成して、他のコンピューターのファイル共有に委任できるようにすることです。これを行うには、Active Directory ユーザーとコンピューター ツールを開き、c2wts が機能している Web アプリケーション アカウントとコンピューター アカウントの委任を構成する必要があります。の上。具体的には、次のことを行う必要があります。

  • コンピューター アカウントなど、関心のあるアカウントを選択します。
  • 右クリック、
  • プロパティを選択し、
  • 委任タブを選択し、
  • 「指定されたサービスへの委任に対してのみこのコンピューターを信頼する」および「任意の認証プロトコルを使用する」を選択し、
  • 接続先のコンピューターから「共通インターネット ファイル システム (cifs)」を追加します。

webapp アカウントに対してもまったく同じことを行う必要があります

「このコンピューターをすべてのサービスへの委任に対して信頼する」という値を設定しても機能しません。

于 2012-11-30T13:14:03.007 に答える