0

TFSイベントサブスクリプションサービスを使用して、Webインターフェイスを介してサブスクリプションを動的に作成しようとしています。サブスクリプションは中間アカウントに送られます。ここでは、2つのアカウントを「非管理者ユーザー」と「サブスクリプションストレージ」と呼びます。

管理者は「サブスクリプションストレージ」アカウントのアラートを作成でき、サブスクリプションストレージアカウントはそれ自体のアラートを作成できますが、管理者以外のユーザーはストレージアカウントにサブスクリプションを作成できません。次のエラーメッセージが表示されます。

アクセスが拒否されました:{ユーザーアカウント名}は、リソース$ SUBSCRIPTIONに対して次の権限が必要です:このアクションを実行するには:編集

私が使用しているコードは次のとおりです。

IEventService eventService = (IEventService)this.tfsCollection.GetService(typeof(IEventService));
eventService.SubscribeEvent(userAccountIdentity.Sid, Strings.WorkItemChangedEvent, string.Format(Strings.Condition0, workItem.ToString(CultureInfo.InvariantCulture)), deliveryPreference, string.Format(Strings.AlertTag0, workItem.ToString(CultureInfo.InvariantCulture)));

すべてのパラメーターが正しく、それらの値はこの議論には無関係であることを信じてください。:)tfsCollectionは、ページのプロパティTfsTeamProjectCollectionに由来するオブジェクトです。Connection.TeamProjectCollection

私の最初の考えは、サービスアカウント(この場合はNetworkService)を使用するように偽装を解除することでした。そこで、Action次のように、を取得して偽装なしで実行する拡張メソッドを作成しました。

    public static void WithoutImpersonation(this Action actionToPerform)
    {
        using (var ctx = WindowsIdentity.Impersonate(IntPtr.Zero))
        {
            try
            {
                actionToPerform();
            }
            finally
            {
                ctx.Undo();
            }
        }
    }

Actionこれにより、 (チェックするとユーザーアカウントではなくNetworkServiceアカウントが返されます)の間、偽装が正しくWindowsIdentity.GetCurrentUser()解除されますが、同じエラーでイベントサブスクリプションの作成に失敗します。の認証されたユーザーTfsTeamProjectCollectionは、NetworkServiceアカウントでもあります。

4

1 に答える 1

1

解決しました!間違った方法でアプローチしていたことがわかりました。クラスをインスタンス化するページから、 を使用EnterTfsImpersonationContextして、ストレージ アカウントの ID を検索し、そのアカウント用に新しいアカウントを作成する必要がありましたTfsTeamProjectCollection。これで問題は解決しました。

于 2012-07-04T20:52:43.703 に答える