marabunta
Goto Top

Powershell PS-Remoting SQL

Wird das nicht so übergeben? Ich hab noch andere Varianten probiert aber hauptproblem ist, dass meine lokale Funktion nicht übergeben wird.


Function SQL{...}

Invoke-Command -ComputerName "$TargetServer" -scriptblock {  
$($Args) $($Args[1]) $($Args[2]) $($Args[3]) $($Args[4]) $($Args[5])
} -Credential $cred -ArgumentList $(SQL), $SQLQuery, $TargetServer, $TargetDatabase, $username, $password 

In C:\Test.ps1:54 Zeichen:7
+ param($($Args), $($Args[1]), $($Args[2]), $($Args[3]), $($Args[4]),
$($Args[5 ...
+       ~
")" fehlt in Funktionsparameterliste.  
In C:\Test.ps1:55 Zeichen:13
+ $($Args[0]) $($Args[1]) $($Args[2]) $($Args[3]) $($Args[4]) $($Args[5])
+             ~~
Unerwartetes Token "$(" in Ausdruck oder Anweisung.  
In C:\Test.ps1:55 Zeichen:25
+ $($Args) $($Args[1]) $($Args[2]) $($Args[3]) $($Args[4]) $($Args[5])
+                         ~~
Unerwartetes Token "$(" in Ausdruck oder Anweisung.  
In C:\Test.ps1:55 Zeichen:37
+ $($Args) $($Args[1]) $($Args[2]) $($Args[3]) $($Args[4]) $($Args[5])
+                                     ~~
Unerwartetes Token "$(" in Ausdruck oder Anweisung.  
In C:\Test.ps1:55 Zeichen:49
+ $($Args) $($Args[1]) $($Args[2]) $($Args[3]) $($Args[4]) $($Args[5])
+                                                 ~~
Unerwartetes Token "$(" in Ausdruck oder Anweisung.  
In C:\Test.ps1:55 Zeichen:61
+ $($Args) $($Args[1]) $($Args[2]) $($Args[3]) $($Args[4]) $($Args[5])
+                                                             ~~
Unerwartetes Token "$(" in Ausdruck oder Anweisung.  
    + CategoryInfo          : ParserError: (:) , ParseException
    + FullyQualifiedErrorId : MissingEndParenthesisInFunctionParameterList

Content-Key: 266536

Url: https://administrator.de/contentid/266536

Printed on: April 24, 2024 at 09:04 o'clock

Member: colinardo
Solution colinardo Mar 17, 2015 updated at 12:31:44 (UTC)
Goto Top
Moin erstmal,
du musst eine Instanz der Funktion übergeben keine Aufruf dieser. Das macht man so:
Invoke-Command -ComputerName "$TargetServer" -scriptblock ${function:SQL} -Credential $cred -ArgumentList $SQLQuery, $TargetServer, $TargetDatabase, $username, $password 
Als Argumente übergibst du alle für die Function "SQL" benötigten.

Grüße Uwe

-edit- Fehler korrigiert ...
Member: Marabunta
Marabunta Mar 17, 2015 updated at 11:32:39 (UTC)
Goto Top
ups hatte noch fehler in den bezeichnungen der variablen... ändert aber nix am ergebnis
function SQL($query,$Targetserver,$Targetdatabase,$username,$password){
    $conn = new-object System.Data.SqlClient.SqlConnection
    $conn.ConnectionString = "Server=$Targetserver;Database=$Targetdatabase;Integrated Security=false; UID=$username;Password=$password"  
...}
Invoke-Command -ComputerName "$TargetServer" -scriptblock ${function:SQL} -Credential $cred -ArgumentList $Query, $TargetServer, $TargetDatabase, $username, $password   

Fehler: Exception calling "Open" with "0" argument(s): "Fehler bei der Anmeldung für den Benutzer 'domain\testuser'."  
Member: colinardo
colinardo Mar 17, 2015 updated at 11:36:46 (UTC)
Goto Top
Fehler: Exception calling "Open" with "0" argument(s): "Fehler bei der Anmeldung für den Benutzer 'domain\testuser'."
Das hat aber gar nichts mit der Funktionsweise von Invoke-Command zu tun sondern das liegt an deiner SQL-Funktion. Da hat diese einen Fehler!
Member: Marabunta
Marabunta Mar 17, 2015 at 11:38:03 (UTC)
Goto Top
Ich hab mir alles ausgeben lassen und das stimmt soweit. Kannst du gegenprüfen ob die Abfrage richtig abgeschickt wird?

Ganze SQL Funktion
function SQL($query,$Targetserver,$Targetdatabase,$username,$password){
    $conn = new-object System.Data.SqlClient.SqlConnection
    $conn.ConnectionString = "Server=$Targetserver;Database=$Targetdatabase;Integrated Security=false; UID=$username;Password=$password"  
    Write-Host "server: $targetserver"  
    Write-host "database: $Targetdatabase"  
    Write-Host "username: $username"  
    Write-Host "pw:$password"  
    Write-Host "query: $query"  
        try{
            $conn.Open()
            $cmd = $conn.CreateCommand()
            $cmd.CommandText = $query
            $cmd.Connection = $conn

            $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
            $SqlAdapter.SelectCommand = $cmd
            $dt = New-Object System.Data.DataTable
            $SqlAdapter.Fill($dt) | out-null
            $conn.close()
            return $dt
        }
        catch{
            echo "Fehler: $($_.Exception.Message)"  
            $conn.close()
            return $false
        }
}
Member: colinardo
colinardo Mar 17, 2015 at 11:41:44 (UTC)
Goto Top
geht hier mit einem MS-SQL-Server einwandfrei ...
Member: Marabunta
Marabunta Mar 17, 2015 at 11:44:20 (UTC)
Goto Top
ok. gehen wir davon aus das skript ist ok. Was müsste auf dem mssql server eingestellt sein, damit das sauber läuft?
Member: colinardo
colinardo Mar 17, 2015 updated at 11:51:41 (UTC)
Goto Top
Zitat von @Marabunta:
ok. gehen wir davon aus das skript ist ok. Was müsste auf dem mssql server eingestellt sein, damit das sauber läuft?
Hier fehlen mir mal wieder die Grundlegenden Infos :
  • OS
  • MS-SQL-Server Version

Ist für den Benutzer überhaupt eine passende SQL-Anmeldung angelegt ? Das wird gerne vergessen...
Das wurde von mir hier schonmal ausführlich erläutert:
SQL Server 2008 Berechtigungen
Member: Marabunta
Marabunta Mar 17, 2015 updated at 11:54:59 (UTC)
Goto Top
Win Server 2003 SP2
MSSQL 2005

Normale Anmeldung mit dem Management Studio auf dem Server unter Verwendung von "Windows Authentication" funktioniert für den User.
Ich schau mir das andere mal an

...mit Integrated Security=true hat es funktioniert...