1

PowerShell を使用して、既存のローカル ユーザーを sysadmin として SQL Server に追加したいと考えています。いくつかの調査の後、これまでのところ次のスクリプトがあります。

$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 に存在し、Users および Administrators グループのメンバーです。次のエラー メッセージが表示されました。

「0」個の引数で「Create」を呼び出し中に例外が発生しました: 「ログイン 'JohnDoe' の作成に失敗しました。」 C:\Users\LocalAdmin\Desktop\try.ps1:7 で char:16 + $SqlUser.Create <<< < () + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException

「1」個の引数を指定して「AddToRole」を呼び出し中に例外が発生しました: 「ログイン 'JohnDoe' のロールへの追加に失敗しました。」 C:\Users\LocalAdmin\Desktop\try.ps1:8 char:23 + $SqlUser.AddToRole < <<< ('sysadmin') + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException

Windows Server 2008 R2 と SQL Server 2008 R2 何が間違っているのか、何が欠けているのでしょうか?

編集: CB と mortb からの提案に基づいてスクリプトを更新しましたが、まだ機能していません。上記のスクリプトを現在の状態に更新し、そのエラーメッセージを現在取得しているものに更新しました。

4

4 に答える 4

5

私はあなたのコードを試しませんでした。しかし、次のものは私の 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()
于 2013-05-17T14:04:42.063 に答える
0
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
于 2013-05-17T14:12:23.920 に答える