连接到 TFS 的 Windows 服务.IGroupSecurityService 实例创建失败,无异常

本文关键字:失败 创建 异常 实例 IGroupSecurityService TFS Windows 服务 连接 | 更新日期: 2023-09-27 18:32:19

我在尝试连接到 TFS 实例的 Windows 2012 R2 服务器上安装了一个正在运行的服务。

打开远程调试并查看代码后,我注意到下面的部分设置了断点。一旦我单击第一行的单步执行,调试器的行为就像我单击继续一样,我退出我的单步执行,调试器声称代码正在继续。没有引发异常。

服务计时器每五分钟调用一次此代码,我认为计时器调用的代码永远不会完成,在第一行之后它会遇到某种崩溃。五分钟后,代码尝试再次运行,所以我知道它没有使整个服务崩溃。

我查看了事件视图,那里没有信息。

IGroupSecurityService gss = (IGroupSecurityService)TfsConfiguration._tfsProjectCollection.GetService(typeof(IGroupSecurityService));
Identity SIDS = gss.ReadIdentity(SearchFactor.AccountName, "Project Collection Valid Users", QueryMembership.Expanded);
List<Identity> FoundIds = gss.ReadIdentities(SearchFactor.Sid, SIDS.Members, QueryMembership.None).ToList();

连接到 TFS 的 Windows 服务.IGroupSecurityService 实例创建失败,无异常

检查这种情况:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Server;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Framework.Client;
namespace API
{
    class Program
    {
        static void Main(string[] args)
        {
            string project = "http://xxx.xxx.xxx.xxx:8080/tfs";
            TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri(project));
            var tps = tpc.GetService<VersionControlServer>();
            var ttt = tps.GetTeamProject("ProjectName");
            ISecurityService securityService = tpc.GetService<ISecurityService>();
            System.Collections.ObjectModel.ReadOnlyCollection<SecurityNamespace> securityNamespaces = securityService.GetSecurityNamespaces();
            IGroupSecurityService gss = tpc.GetService<IGroupSecurityService>();
            Identity SIDS = gss.ReadIdentity(SearchFactor.AccountName, "GroupName", QueryMembership.Expanded);//GourName format: [ProjectName]''GourpName
            IdentityDescriptor id = new IdentityDescriptor("Microsoft.TeamFoundation.Identity", SIDS.Sid);
            List<SecurityNamespace> securityList = securityNamespaces.ToList<SecurityNamespace>();
            string securityToken;
            foreach (SecurityNamespace sn in securityList)
            {
                if (sn.Description.DisplayName == "Project")
                {
                    securityToken = "$PROJECT:" + ttt.ArtifactUri.AbsoluteUri;
                    sn.SetPermissions(securityToken, id, 115, 0, true);
                }
            }                
        }
    }
}

我的假设最终偏离了基础。这不是问题的根源。我将在另一个问题中发布真实案例。这已经是两周的问题了,很抱歉在这里浪费了一个问题。