none
Azure SQL Database: Select- & Insert-Befehl im Runbook unter ausführendes Konto ausführen

    Frage

  • Hallo alle zusammen, 

    wir würden gerne mit Hilfe des Automation Account (Runbook, Zeitplan) eine Protokollierung unserer Kunden- und Artikelbestände in Azure SQL Database (Kein VM) über Jahre hinweg protokollieren. 

    Der Befehl lautet vereinfacht wie folgt: insert into dbo.tbl_Protokoll (ZeilenAnzahl) select count(*) from dbo.tbl_Artikel;

    Nun würden wir gerne diesen Befehl in ein PowerShell-Runbook einbinden, aber diesen SQL Befehl mit Hilfe des ausführenden Kontos (!) im PowerShell-Runbook ausführen. 

    Ich schaffe es über die SQL Authentifizierung

        $DatabaseConnection = New-Object System.Data.SqlClient.SqlConnection

        $DatabaseConnection.ConnectionString = "Data Source=xxx.database.windows.net; 
           Initial Catalog=xxxDB;Integrated Security=False; User ID=xxx; Password=xxx"

        $DatabaseConnection.Open()

      und dann 

    $DatabaseCommand = New-Object System.Data.SqlClient.SqlCommand

    $DatabaseCommand.Connection = $DatabaseConnection

                      $DatabaseCommand.CommandText "insert into dbo.tbl_Protokoll (ZeilenAnzahl) select
                                       count(*) from dbo.tbl_Artikel

    , aber eben leider nicht mit Hilfe des ausführenden Kontos.

    Zwar schaffe ich eine Verbindung aufzubauen, ...

    $ServicePrincipalDetails = Get-AutomationConnection -Name "AzureRunAsConnection"
            $Connection = Add-AzureRmAccount `
                -ServicePrincipal `
                -ApplicationId          $ServicePrincipalDetails.ApplicationId `
                -TenantId               $ServicePrincipalDetails.TenantId `
                -CertificateThumbprint  $ServicePrincipalDetails.CertificateThumbprint

    .. aber dann fehlt mir der Befehl, wie ich einen SQL-Befehl unter dieser Verbindung abfeuern kann. 

    Muss aber auch ehrlich zugeben, dass ich noch nicht der PowerShell-Experte bin und meine bisherigen Google-Versuche waren leider nicht von Erfolg gekrönt.

    Hintergrund: Wir möchten gerne aus Sicherheitsgründen keine SQL Authentifizierung benutzen. 

    Herzlichen Dank für Eure Unterstützung!

    Viele Grüße
    Johannes 

    Dienstag, 27. Februar 2018 13:43

Antworten

  • Nun, mit den Befehlen bewegst du dich in der Verwaltungsebene für Datenbanken:

    "The Set-AzureRmSqlDatabase cmdlet sets properties for a database in Azure SQL Database."

    https://docs.microsoft.com/en-us/powershell/module/azurerm.sql/set-azurermsqldatabase?view=azurermps-5.4.0

    Um in der Datenbank zu arbeiten, musst du dich mit der Datenbank selber direkt verbinden, was natürlich nur mit den SQL-Objekten aus den SqlClient funktioniert.
    Dies ist der native .NET-Treiber für SQL-Server, alternativ kann man natürlich auch mit ODBC zugreifen.
    Aber mit der Verwaltung selber hat das nun nichts zu tun.

    • Als Antwort markiert J. Curio Mittwoch, 28. Februar 2018 13:38
    Mittwoch, 28. Februar 2018 13:27

Alle Antworten

  • Nun, dann wird wohl die Windows-Authentifizierung verwendet und dann musst du das Script unter dem User ausführen lassen, der berechtigt ist, denn ohne eine korrekte Anmeldung am SQL-Server gehts ja nicht.

    Dienstag, 27. Februar 2018 15:47
  • aber diesen SQL Befehl mit Hilfe des ausführenden Kontos (!) im PowerShell-Runbook ausführen. 

    Hallo Johannes,

    ich verstehe nicht, was Du meinst. Du verwendest SQL Authentifizierung, was für SQL Azure die einfachste/bevorzugte Art; was hat das nun mit dem ausführenden Konto zu tun und wo genau ist hier nun das Problem?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 27. Februar 2018 16:19
  • Da stellt sich mir auch die Frage, wie du ohne eine DB-Verbindung SQL's für die DB ausführen willst.
    Du kannst dann zwar User ID und Password weglassen, wobei der Treiber sich dann aber mit Windowsauthentifizierung anmelden will, was in der DB auch zugelassen werden muss.

    Get-AutomationConnection ist nun mal keine SQLConnection.

    Dienstag, 27. Februar 2018 17:40
  • Hallo bfuerchau, Danke Dir für Deine schnelle Antwort. Das ausführende Konto ist also ein Windows-Konto / App, den ich auf den SQL Server berechtigen müsste. Eigentlich naheliegend und der OnPrem-Welt ähnlich. Deshalb Danke! Werde es gleich mal versuchen. 

    Auf der anderen Seite schaffe ich es mit folgenden Befehlen ... 

    $ServicePrincipalDetails = Get-AutomationConnection -Name "AzureRunAsConnection"
    # Mit dem Befehl "Add-AzureRmAccount" eröffnen wir eine neue Verbindung zu unserem Azure.
            $Connection = Add-AzureRmAccount `
              -ServicePrincipal `
              -ApplicationId          $ServicePrincipalDetails.ApplicationId `
              -TenantId               $ServicePrincipalDetails.TenantId `
              -CertificateThumbprint  $ServicePrincipalDetails.CertificateThumbprint

           $database = Set-AzureRmSqlDatabase `
                        -ResourceGroupName $ResourceGroupName `
                        -ServerName $sqlservername `
                        -DatabaseName $DatabaseName `
      
                      -Edition $Edition `
                        -RequestedServiceObjectiveName $PerfLevel

    ... die Änderung des Tarifs der Datenbank vorzunehmen. Das ausführende Konto hat somit Verbindungsrechte auf die SQL Datenbank und darf sogar einen "Alter Database"-Befehl ausführen.  Denn hinter Set-AzureRMSqlDatase steckt letztlich ein Alter Database-Befehl. Also scheinbar hat das ausführende Konto bereits Rechte zu haben ... Das wundert mich und versuche ich zu verstehen. 

    Noch eine Frage zum Schluss: Gibt es auch einen Befehl so in etwas Set-AzureRM-SQLCommand
    Finde leider keinen passenden Befehl in der Richtung. 

    Danke Dir wieder für eine erneute Antwort im Voraus. Freue mich drauf. 

    Viele Grüße

    Johannes 


    • Bearbeitet J. Curio Mittwoch, 28. Februar 2018 12:50
    Mittwoch, 28. Februar 2018 12:43
  • Hallo Olaf, 

    Danke Dir auch für Deine schnelle Antwort. Ich versuche zu verstehen, mit welchen Möglichkeiten ich in Azure auf die Datenbank komme. Habe 2 gefunden und versuche die zu verstehen. Darf ich auch auf meine Antwort an bfuerchau verweisen? Danke Dir! 

    Viele Grüße
    Johannes 

    Mittwoch, 28. Februar 2018 12:47
  • Nun, mit den Befehlen bewegst du dich in der Verwaltungsebene für Datenbanken:

    "The Set-AzureRmSqlDatabase cmdlet sets properties for a database in Azure SQL Database."

    https://docs.microsoft.com/en-us/powershell/module/azurerm.sql/set-azurermsqldatabase?view=azurermps-5.4.0

    Um in der Datenbank zu arbeiten, musst du dich mit der Datenbank selber direkt verbinden, was natürlich nur mit den SQL-Objekten aus den SqlClient funktioniert.
    Dies ist der native .NET-Treiber für SQL-Server, alternativ kann man natürlich auch mit ODBC zugreifen.
    Aber mit der Verwaltung selber hat das nun nichts zu tun.

    • Als Antwort markiert J. Curio Mittwoch, 28. Februar 2018 13:38
    Mittwoch, 28. Februar 2018 13:27
  • Hallo bfuerchau, 

    Danke Dir wieder für die schnelle Info. Deine / Eure Anmerkungen haben mir schon mal sehr weitergeholfen. Jetzt versuche ich mal das ausführende Konto auf meinem SQL Server zu berechtigen. Erste Schritte habe ich schon unternommen. 

    Viele Grüße
    Johannes 

    Mittwoch, 28. Februar 2018 13:46