通过Powershell使用不同的用户凭据连接到TFS
我已经编写了一个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)
我无法对此进行有效测试,但这似乎是SO对此问题的常见答案。
$cred = New-Object NetworkCredential("myuser", "myPassword", "mydomain")
$tfsCollection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection
(
$tfsServer,
$cred
)
这基本上是我需要的答案,所以我标记为这样。我不得不做一些小的编辑工作,虽然(我实际上已经看到了这个答案,但由于我最初无法使用它而被驳回)。 我用最新的代码编辑了最初的问题。 – Detail
立即想到的问题是,“为什么当TFS已经具备构建和部署功能时,您是否重新发明了轮子?” –
嗨,丹尼尔,那不是我真正想要的,但是因为你问这家公司只有TFS2013,并且没有部署能力。你对这个问题有答案吗? – Detail