Windows用户添加到PowerShell的本地SQL Server(Add Windows Us

2019-09-04 02:20发布

我想将现有的本地用户添加到SQL Server作为一个系统管理员,使用PowerShell。 压脚提升一些研究,我有以下脚本至今:

$Username = "JohnDoe"

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 
$SqlServer = New-Object ('Microsoft.SqlServer.Management.Smo.Server') "localhost"
$SqlUser = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Login -ArgumentList $SqlServer, "$Username"
$SqlUser.LoginType = 'WindowsUser'
$SqlUser.Create()
$SqlUser.AddToRole('sysadmin')

用户存在于localhost,它是用户和管理员组的成员。 我得到了以下错误信息:

异常调用 “创建” 和 “0” 的说法(S): “创建失败登录 'JOHNDOE'。” 在C:\ Users \用户为localadmin \桌面\ try.ps1:7字符:16 + $ SqlUser.Create <<< <()+ CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException

异常调用 “AddToRole” 与 “1” 的说法(S): “添加到角色失败登录 'JOHNDOE'。” 在C:\ Users \用户为localadmin \桌面\ try.ps1:8字符:23 + $ SqlUser.AddToRole < <<<( '系统管理员')+ CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException

在Windows Server 2008 R2与SQL Server 2008 R2什么我做错了还是什么我缺少什么?

编辑:更新的基础上,从CB和mortb的suggessions剧本,但仍然没有工作。 我已经更新上面的当前状态的脚本,并与一个东西我现在得到的错误消息。

Answer 1:

我没有尝试你的代码。 但是,下面的一个工作,我对我的SQL Express实例。

    $conn = New-Object Microsoft.SqlServer.Management.Common.ServerConnection -ArgumentList $env:ComputerName
$conn.applicationName = "PowerShell SMO"
$conn.ServerInstance = ".\SQLEXPRESS"
$conn.StatementTimeout = 0
$conn.Connect()
$smo = New-Object Microsoft.SqlServer.Management.Smo.Server -ArgumentList $conn
$SqlUser = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Login -ArgumentList $smo,"${env:ComputerName}\JohnDoe"
$SqlUser.LoginType = 'WindowsUser'
$sqlUser.PasswordPolicyEnforced = $false
$SqlUser.Create()


Answer 2:

更改

'$Username'

"$Username"

需要注意的是在PowerShell中的变量不是在单引号扩大,那么“$用户名”是取为文字而不是为变量的值。



Answer 3:

function SQL-Get-Server-Instance
{
    param (
        [parameter(Mandatory = $true)][string] $DatabaseServer,
        [parameter(Mandatory = $true)][string] $InstanceName
    )

    if (!$InstanceName -or $InstanceName -eq "" -or $InstanceName -eq "MSSQLSERVER")
        { return $DatabaseServer }
    else
        { return "$DatabaseServer\$InstanceName" }
}


function Create-SQL-Login
{
    param (
        [parameter(Mandatory = $true)][string] $loginName,
        [parameter(Mandatory = $true)][string] $DatabaseServer,
        [parameter(Mandatory = $false)][string] $InstanceName = "MSSQLSERVER"
    )

    $sqlConnection = $null

    try
    {
        $Error.Clear()

        $ServerInstance = SQL-Get-Server-Instance $DatabaseServer $InstanceName
        $sqlConnection = New-Object System.Data.SqlClient.SqlConnection
        $sqlConnection.ConnectionString = "Server=$ServerInstance;Database=master;Trusted_Connection=True;"

        $Command = New-Object System.Data.SqlClient.SqlCommand
        $Command.CommandType = 1
        $Command.Connection = $sqlConnection
        $Command.CommandText = "create login [$loginName] from windows with default_database=[master], default_language=[us_english]"
        $sqlConnection.Open()
        $Command.ExecuteNonQuery() | Out-Null
        $Command.CommandText = "exec master..sp_addsrvrolemember @loginame = N'$loginName', @rolename = N'sysadmin'"
        $Command.ExecuteNonQuery() | Out-Null
    }

    catch
    {
        $str = (([string] $Error).Split(':'))[1]
        Write-Error ($str.Replace('"', ''))
    }

    finally
    {
        if ($sqlConnection)
            { $sqlConnection.Close() }
    }
}

你这样称呼它:

Create-SQL-Login $env:COMPUTERNAME\JohnDoe $env:COMPUTERNAME


Answer 4:

找到更简单的东西

Add-SqlLogin -ServerInstance <Server> -LoginName <User> -LoginType <LoginType> -DefaultDatabase tempdb -Enable -GrantConnectSql -LoginPSCredential $Credential
((New-Object ('Microsoft.SqlServer.Management.Smo.Server') "<Server>").Roles | where {$_.Name -eq 'sysadmin'}).AddMember("<User>")



文章来源: Add Windows User to local SQL Server with PowerShell