0

TFSオブジェクトモデルを使用する場合、アイテムレベルのACLはVersionControlServer.SetPermissionsメソッドで設定できます。このメソッドは、PermissionChangeが継承するSecurityChangeオブジェクトの配列を取ります。PermissionChangeクラスは、許可、許可の拒否、および削除(特定の許可をリセットして未設定に戻すため)の文字列の配列を取ります。これらのアイテムレベルの権限は、VersionControlServer.GetPermissionsメソッドで表示できます。

アイテムレベルのアクセス許可がVersionControlServer.SetPermissionsメソッドで設定されると、新しいアクセス許可オブジェクトが作成され、ServerItemがそのアイテムのサーバーパスに設定されます。アクセス許可オブジェクトには、そのユーザーまたはグループのすべてのアクセス許可が継承されている場合でも、ソース管理のアイテムの上に定義された各ユーザーまたはグループのエントリを含むEntriesプロパティがあります。さらに、アイテムに以前に設定されたアクセス許可をリセットした場合でも、継承されていないエントリが含まれていなくても、アクセス許可オブジェクトはサーバーに残ります。

つまり、時間の経過とともに、これらのアクセス許可オブジェクトのサイズは厳密に増加しているようです。これらのメソッドのパフォーマンスは、(たとえば、ブランチレベルで)大量の情報が返されるために低下し始めており、これらをクリーンアップするためのRemovePermissionsメソッドを知りません。そのようなものは存在しますか?サーバー上でこれらのクラッターオブジェクトが定義されていない状態でアイテムがACLを透過的に継承するように、これらを永続的に削除するにはどうすればよいですか?

4

2 に答える 2

1

2010 年に、TFS は、製品内のすべてのアクセス許可を管理する新しいセキュリティ サービスを導入しました。各権限グループは、セキュリティ名前空間に分割されます。この機能を公開する新しいサービスを使用して、目的を達成できます。以下でこのコードをテストしていませんが、近いはずです。

まず、次の参照を追加します。

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.VersionControl.Common;

そして、次のコードを実行します。

// Somehow define which paths you want to delete security on.
string[] pathsToDeleteSecurityOn = new string[0];

TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://your-server:8080/tfs/your-collection"));
ISecurityService securityService = tpc.GetService<ISecurityService>();

// Get the version control security namespace
SecurityNamespace vcSecurity = securityService.GetSecurityNamespace(SecurityConstants.RepositorySecurityNamespaceGuid);

// Delete the ACLs on each path
foreach (string path in pathsToDeleteSecurityOn)
{
    vcSecurity.RemoveAccessControlLists(path, false);
}

問題が発生した場合はお知らせください。

于 2012-04-29T20:33:20.950 に答える
-1

あなたがやりたいことは不可能のようです。確認する最善の方法は、Buck Hodgesに連絡して直接尋ねることです。

可能であれば、答えはMicrosoft.TeamFoundation.VersionControl.Server名前空間 (クライアントではなくバージョン コントロールのサーバー) にあります。

ドキュメントを見た後、そのような機能は見つかりませんでした。

于 2012-04-27T09:35:49.377 に答える