SSAS使用PowerShell将成员添加到服务器管理员角色

时间:2017-04-21 09:25:41

标签: sql-server powershell

我正在尝试使用PowerShell将成员添加到服务器管理员角色。我可以为每个可用的单独数据库添加角色和成员,但我想将其添加到顶层,以便给定用户可以访问数据库。

enter image description here

这是我目前的代码,但我收到错误:

  

使用“1”参数调用“添加”的异常:“集合具有固定大小。”   在D:\ Untitled8.ps1:15 char:1   + $ targetsvr.Roles.Members.Add($ syncAccount)   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:NotSpecified:(:) [],MethodInvocationException       + FullyQualifiedErrorId:NotSupportedException

Function Add-NewMember
{
[CmdletBinding()]
param(
[Parameter(Position=0,mandatory=$true)]
[string] $ssasInstance,
[Parameter(Position=1,mandatory=$true)]
[string] $syncAccount ="NT Service\SQLSERVERAGENT")

[void][System.reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices")

$targetsvr = new-Object Microsoft.AnalysisServices.Server
$targetsvr.Connect($ssasInstance)

$targetsvr.Roles.Members.Add($syncAccount)
}
Add-NewMember -ssasInstance "localhost" -syncAccount "NT SERVICE\SQLSERVERAGENT"

1 个答案:

答案 0 :(得分:4)

$targetsvr.Roles.Members是一个合法表达式,它会生成所有角色的所有成员的集合(它等同于$targetsvr.Roles | Foreach { $_.Members })。但是这个集合是由PowerShell合成的,而不是某个东西的实际成员,所以你不能修改它。您想要$targetsvr.Roles["Administrators"].Members。您明确需要在服务器看到更改之前更新角色。并且您希望为cmdlet提供更好的名称。如果我可以:

Function Add-ASAdministrator {
    param(
        [Parameter(Mandatory=$True, ValueFromPipeline)]
        [string] $User,

        [string] $Instance = "."
    )
    $server = New-Object Microsoft.AnalysisServices.Server
    $server.Connect($Instance)
    $administrators = $server.Roles["Administrators"]
    if ($administrators.Members.Name -notcontains $User) {
        $administrators.Members.Add($User) | Out-Null
        $administrators.Update()
    }
    $server.Disconnect()
}
相关问题