Security 将广告用户添加到TFS组时,是否有方法在TFS中进行注释? 我想知道我是否可以在Team Foundation Server的某个地方发表评论,当我将广告用户添加到TFS组或更改用户组时,出于审计目的。 因为它的价值-我写了一个C方法来从每个TFS组中拉出所有成员的列表。希望有帮助

Security 将广告用户添加到TFS组时,是否有方法在TFS中进行注释? 我想知道我是否可以在Team Foundation Server的某个地方发表评论,当我将广告用户添加到TFS组或更改用户组时,出于审计目的。 因为它的价值-我写了一个C方法来从每个TFS组中拉出所有成员的列表。希望有帮助,security,tfs,Security,Tfs,编辑:这是作为一个答案发布的,因为“xidada”将编写一个脚本来提取信息,而且由于我已经有了获取所需信息的代码,我认为该代码将是帮助他/她使用脚本的指南 private void btn\u GetNow\u Click() { TfsTeamProjectCollection tfs=新TfsTeamProjectCollection(新Uri(“http://server/collection")); tfs.确保重新验证(); tfs配置服务器srv=tfs.ConfigurationS

编辑:这是作为一个答案发布的,因为“xidada”将编写一个脚本来提取信息,而且由于我已经有了获取所需信息的代码,我认为该代码将是帮助他/她使用脚本的指南

private void btn\u GetNow\u Click()
{
TfsTeamProjectCollection tfs=新TfsTeamProjectCollection(新Uri(“http://server/collection"));
tfs.确保重新验证();
tfs配置服务器srv=tfs.ConfigurationServer;
CatalogNode配置服务器节点=srv.CatalogNode;
//为所有团队项目集合节点查询配置服务器节点的子节点
ReadOnlyCollection tpcNodes=configurationServerNode.QueryChildren(
新Guid[]{CatalogResourceTypes.ProjectCollection},
假,,
目录查询选项。无
);
Guid tpcId=新Guid(tpcNodes[0].Resource.Properties[“InstanceId”]);
TfsTeamProjectCollection tpc=srv.GetTeamProjectCollection(tpcId);
//获取对工作项跟踪服务的引用
var workItemStore=tpc.GetService();
列表结果=新列表();
//迭代项目
foreach(workItemStore.Projects中的项目)
{
Console.WriteLine(“\t项目:{0}”,项目名称);
尝试
{
VersionControlServer versionControl=(VersionControlServer)tpc.GetService(typeof(VersionControlServer));
TeamProject TeamProject=versionControl.GetTeamProject(project.Name);
IGroupSecurityService gss=(IGroupSecurityService)tpc.GetService();
Identity[]appGroups=gss.ListApplicationGroups(teamProject.ArtifactUri.AbsoluteUri);
foreach(appGroups中的标识组)
{
rtb_Users.AppendText(group.DisplayName+“\n”);
Identity[]groupMembers=gss.readIdentifies(SearchFactor.Sid,新字符串[]{group.Sid},QueryMembership.Expanded);
foreach(groupMembers中的身份成员)
{
如果(member.Members!=null)
{
foreach(member.Members中的字符串memberSid)
{
Identity memberInfo=gss.ReadIdentity(SearchFactor.Sid、memberSid、QueryMembership.None);
if(memberInfo.Type==IdentityType.WindowsUser)
{
如果(!result.Contains(memberInfo))
{
结果.添加(memberInfo);
rtb_Users.AppendText(“\t\t”+memberInfo.AccountName+”-“+memberInfo.DisplayName+”-“+memberInfo.Domain+”\n”);
}
其他的
{
Console.WriteLine(“\t\t用户已可用”+memberInfo.AccountName);
}
}
}
}
}
}
}
捕获(例外情况除外)
{
Console.WriteLine(“\t项目:{0}引发异常:{1},将被忽略。”,Project.Name,ex.Message);
}
} 
} 

此方法已按原样从我的应用程序中取出,需要根据您的需要进行自定义。

我已创建了一个PowerShell脚本,用于记录TFS用户数据库的day2day更改,并查询广告以了解是谁批准了此更改。
现在我们有了一个自制的数据库。

AFAIK没有现成的方法来实现这一点。我想我将创建一个脚本,每天运行,以确定对组成员资格的更改。至少我知道哪位用户在某一天被添加/删除到某个组中/从中删除。有人能解释一下为什么这被否决吗?这是作为一个答案发布的,因为“xidada”将编写一个脚本来获取信息,我认为代码将是帮助他的指南。
 private void btn_GetNow_Click()
    {
        TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("http://server/collection"));
        tfs.EnsureAuthenticated();

        TfsConfigurationServer srv = tfs.ConfigurationServer;

        CatalogNode configurationServerNode = srv.CatalogNode;

        // Query the children of the configuration server node for all of the team project collection nodes
        ReadOnlyCollection<CatalogNode> tpcNodes = configurationServerNode.QueryChildren(
              new Guid[] { CatalogResourceTypes.ProjectCollection },
              false,
              CatalogQueryOptions.None
            );

        Guid tpcId = new Guid(tpcNodes[0].Resource.Properties["InstanceId"]);
        TfsTeamProjectCollection tpc = srv.GetTeamProjectCollection(tpcId);

        // get a reference to the work item tracking service
        var workItemStore = tpc.GetService<WorkItemStore>();
        List<Identity> result = new List<Identity>();
        // iterate over the projects
        foreach (Project project in workItemStore.Projects)
        {
            Console.WriteLine("\tProject: {0}", project.Name);
            try
            {
                VersionControlServer versionControl = (VersionControlServer)tpc.GetService(typeof(VersionControlServer));
                TeamProject teamProject = versionControl.GetTeamProject(project.Name);
                IGroupSecurityService gss = (IGroupSecurityService)tpc.GetService<IGroupSecurityService>();
                Identity[] appGroups = gss.ListApplicationGroups(teamProject.ArtifactUri.AbsoluteUri);

                foreach (Identity group in appGroups)
                {
                    rtb_Users.AppendText(group.DisplayName + "\n");
                    Identity[] groupMembers = gss.ReadIdentities(SearchFactor.Sid, new string[] { group.Sid }, QueryMembership.Expanded);
                    foreach (Identity member in groupMembers)
                    {
                        if (member.Members != null)
                        {
                            foreach (string memberSid in member.Members)
                            {
                                Identity memberInfo = gss.ReadIdentity(SearchFactor.Sid, memberSid, QueryMembership.None);
                                if (memberInfo.Type == IdentityType.WindowsUser)
                                {
                                    if (!result.Contains(memberInfo))
                                    {
                                        result.Add(memberInfo);
                                        rtb_Users.AppendText("\t\t" + memberInfo.AccountName + " - " + memberInfo.DisplayName + " - " + memberInfo.Domain + "\n");
                                    }
                                    else
                                    {
                                        Console.WriteLine("\t\tUser already available " + memberInfo.AccountName);
                                    }

                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("\tThe Project: '{0}' throws an exception: {1} and will be ignored.", project.Name, ex.Message);
            }
        } 
    }