2017-04-11 69 views
0

我已经编写了一个Powershell脚本,它连接到我们的TFS服务器,创建工作区,下载最新源代码并执行每晚构建和发布。通过Powershell使用不同的用户凭据连接到TFS

我遇到的问题是,它始终与我自己的凭据连接,从我读过的内容来看,这是因为我已登录到机器上。我已经创建了一个新的域用户帐户,并且我们已在TFS中授予了此管理员权限,但是我无法使脚本使用这些凭据。

下面是与初始连接和工作区创建涉及脚本的一部分,因为它目前为:

$subfolder = [System.Guid]::NewGuid().ToString() 
$tfsServer = "http://tfsserver:8080/tfs/xyz" 

$tfsCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($tfsServer) 
$tfsVersionCtrlType = [Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer] 
$tfsVersionCtrl = $tfsCollection.GetService([type] $tfsVersionCtrlType) 
$tfsWorkspace = $tfsVersionCtrl.CreateWorkspace($subfolder, $tfsVersionCtrl.AuthenticatedUser) 

为了完整起见,这里的“获取”逻辑的其余部分:

$tfsWorkspace.Map($serverLocation, $localLocation) 
$recursion = [Microsoft.TeamFoundation.VersionControl.Client.RecursionType]::Full 
$versionSpec = [Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::Latest 

$itemSpec = New-Object Microsoft.TeamFoundation.VersionControl.Client.ItemSpec($serverLocation, $recursion) 
$fileRequest = New-Object Microsoft.TeamFoundation.VersionControl.Client.GetRequest($itemSpec, $versionSpec) 
$getStatus = $tfsWorkspace.Get($fileRequest, [Microsoft.TeamFoundation.VersionControl.Client.GetOptions]::Overwrite) 

我通过Powershell使用TFS时遇到的主要问题是,Microsoft在不断改变它们的实现方式(在某些情况下,这种情况非常激烈),我们留下的是代码帖子和散布在互联网上的文档碎片(包括SO ) 哪一个 请参阅旧插件和其他现在已过时的参考文献,这些参考文献会带您走上错误的路径。无论如何,所以我已经尝试创建Windows凭据,PSCredentials等(似乎没有被任何东西接受),因此提供ICredential的旧方法现在已经过时,我真的不知道该去哪里转。

基本上,我只是想创建一个工作区,检出项目,更新文件并将它们重新检入 - 全部作为我们新的“tfsService”用户帐户。请帮助...

更新: 根据@Nick的答案,我需要做出以下更改。请注意使用[System.Uri]这是需要这个工作对我来说(不知道这是我的设置怪癖,因为其他人似乎并不需要这样)。另外,我需要将构造函数调用TfsTeamProjectCollection全部放在一行上,因为按照Nick的示例将其分割成不同的行,对我来说也不起作用。

$cred = New-Object System.Net.NetworkCredential("username", "password", "domain") 
$tfsCollection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection([System.Uri]$tfsServer, $cred) 
#$tfsCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($tfsServer) 

$tfsVersionCtrlType = [Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer] 
$tfsVersionCtrl = $tfsCollection.GetService([type] $tfsVersionCtrlType) 
$tfsWorkspace = $tfsVersionCtrl.CreateWorkspace($subfolder, $tfsVersionCtrl.AuthenticatedUser) 
+0

立即想到的问题是,“为什么当TFS已经具备构建和部署功能时,您是否重新发明了轮子?” –

+0

嗨,丹尼尔,那不是我真正想要的,但是因为你问这家公司只有TFS2013,并且没有部署能力。你对这个问题有答案吗? – Detail

回答

1

我无法对此进行有效测试,但这似乎是SO对此问题的常见答案。

$cred = New-Object NetworkCredential("myuser", "myPassword", "mydomain") 
$tfsCollection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection 
(
    $tfsServer, 
    $cred 
) 
+0

这基本上是我需要的答案,所以我标记为这样。我不得不做一些小的编辑工作,虽然(我实际上已经看到了这个答案,但由于我最初无法使用它而被驳回)。 我用最新的代码编辑了最初的问题。 – Detail

相关问题