代码之家  ›  专栏  ›  技术社区  ›  phydeauxman

正在将Azure AD帐户添加为SQL登录,但PowerShell失败

  •  0
  • phydeauxman  · 技术社区  · 7 年前

    CREATE USER [<aad_group_to_add>] FROM EXTERNAL PROVIDER 它执行时没有问题,并添加帐户没有问题。

    Function Get-AADToken {
      [CmdletBinding()]
      [OutputType([string])]
      PARAM (
          [String]$TenantID,
          [string]$ServicePrincipalId,
          [securestring]$ServicePrincipalPwd
      )
      Try {
          # Set Resource URI to Azure Database
          $resourceAppIdURI = 'https://database.usgovcloudapi.net/'
    
          # Set Authority to Azure AD Tenant
          $authority = 'https://login.microsoftonline.us/' + $TenantID
          $ClientCred = [Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]::new($ServicePrincipalId, $ServicePrincipalPwd)
          $authContext = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]::new($authority)
          $authResult = $authContext.AcquireTokenAsync($resourceAppIdURI, $ClientCred)
          $Token = $authResult.Result.AccessToken
      }
      Catch {
          Throw $_
          $ErrorMessage = 'Failed to aquire Azure AD token.'
          Write-Error -Message 'Failed to aquire Azure AD token'
      }
      $Token
    }
    
    # Variables
    $tenantId = '<tenant_id>'
    $subscription_Id = '<subscription_id>'
    $kvName = "mykv"
    $kvSecret = "mysppw"
    $spDisplayName = "mysp"
    $environmentName = "AzureUsGovernment"
    
    # Login to Azure Resource Management portal
    Write-Host "Checking context...";
    $context = Get-AzureRmContext
    if($null -ne $context){
      if(!(($context.Subscription.TenantId -match $tenant_Id) -and ($context.Subscription.Id -match $subscription_Id))){
        do{
          Remove-AzureRmAccount -ErrorAction SilentlyContinue | Out-Null
          $context = Get-AzureRmContext
          }
        until($null -ne $context)
        Login-AzureRmAccount -EnvironmentName $environmentName -TenantId $tenantId -Subscription $subscription_Id
        }
      }
    else{
      Login-AzureRmAccount -EnvironmentName $environmentName -TenantId $tenantId -Subscription $subscription_Id
      }
    
    # Connect to db using specific SQL SP Account "oca-inl-sql-sp1"
    $ServicePrincipalId = (Get-AzureRmADServicePrincipal -DisplayName 
    $spDisplayName).ApplicationId.Guid
    $sql_sp_secret = (Get-AzureKeyVaultSecret -VaultName $kvName -Name 
    $kvSecret).SecretValueText
    $SecureStringPassword = ConvertTo-SecureString -AsPlainText $sql_sp_secret -Force
    
    # Run the Function to get the AD Token for the sql sp
    Get-AADToken -TenantID $TenantID -ServicePrincipalId $ServicePrincipalId - ServicePrincipalPwd $SecureStringPassword -OutVariable SPNToken
    
    # Create connection to sql server
    Write-Verbose "Create SQL connectionstring"
    $conn = New-Object System.Data.SqlClient.SQLConnection
    $SQLServerName = "mysqlsrv"
    $DatabaseName = "mydb"
    $conn.ConnectionString = "Data 
    Source=$SQLServerName.database.usgovcloudapi.net;Initial Catalog=$DatabaseName;Connect Timeout=30"
    $conn.AccessToken = $($SPNToken)
    $conn
    
    # Create the T-SQL Querys to be executing inside of the sql connection
    Write-Verbose "Connect to database and execute SQL script"
    $conn.Open()
    
    $query = "CREATE USER [<aad_group_to_add>] FROM EXTERNAL PROVIDER"
    
    # Execute the queries using the connection created previously
    $command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $conn)     
    $Result = $command.ExecuteScalar()
    $Result
    $conn.Close() 
    

    当运行上面的脚本时,我们得到错误 Exception calling "ExecuteScalar" with "0" argument(s): "Principal '<aad_group_to_add>' could not be found at this time

    1 回复  |  直到 7 年前
        1
  •  1
  •   Adam Johnson    7 年前

     $query ='
      CREATE USER [GROUPTOADD] FROM EXTERNAL PROVIDER
      ALTER ROLE db_datawriter ADD MEMBER [GROUPTOADD]
      ALTER ROLE db_datareader ADD MEMBER [GROUPTOADD]  
      GRANT CONNECT TO [GROUPTOADD]
      GRANT EXECUTE TO [GROUPTOADD]
    '
    
      $con = "Data Source=$(DatabaseServer);Initial Catalog=$(DatabaseName);User ID=$(ADDatabaseUser);Password='$(ADDbPwd)';Connect Timeout=30;Encrypt=False;Authentication='Active Directory Password'"
    Invoke-Sqlcmd -Query $query -ConnectionString $con
    
    推荐文章