Security 将广告用户添加到TFS组时,是否有方法在TFS中进行注释? 我想知道我是否可以在Team Foundation Server的某个地方发表评论,当我将广告用户添加到TFS组或更改用户组时,出于审计目的。 因为它的价值-我写了一个C方法来从每个TFS组中拉出所有成员的列表。希望有帮助
编辑:这是作为一个答案发布的,因为“xidada”将编写一个脚本来提取信息,而且由于我已经有了获取所需信息的代码,我认为该代码将是帮助他/她使用脚本的指南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
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);
}
}
}