1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

SQL SERVERデータベースに接続して操作するためのPowerShellコード

2022-01-04 20:23:02

コアコード

#Configuration information
$Database = 'DemoDB'
$Server = '"WIN-AHAU9NO5R6U\DOG"'
$UserName = 'kk'
$Password = '123456'

#Create connection object
$SqlConn = New-Object System.Data.SqlClient.

#Connect to MSSQL using account
$SqlConn.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;user id=$UserName;pwd=$Password"

#or connect to MSSQL with windows authentication
#$SqlConn.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;Integrated Security=SSPI;"

#Open database connection
$SqlConn.open()

#Execute statement method one
$SqlCmd = New-Object System.Data.SqlClient.
$SqlCmd.connection = $SqlConn
$SqlCmd.commandtext = 'delete top(1) from dbo.
$SqlCmd.executenonquery()

#Execute statement method two
$SqlCmd = $SqlConn.CreateCommand()
$SqlCmd.commandtext = 'delete top(1) from dbo.
$SqlCmd.ExecuteScalar()

# Method 3, query display
$SqlCmd.commandtext = 'select name,recovery_model_desc,log_reuse_wait_desc from sys.databases'
$SqlAdapter = New-Object System.Data.SqlClient.
$SqlAdapter.SelectCommand = $SqlCmd
$set = New-Object data.dataset
$SqlAdapter.Fill($set)
$set.Tables[0] | Format-Table -Auto 

#Close the database connection
$SqlConn.close()

以下は、マイクロソフト社の公式ヘルプ文書です。 Windows PowerShell。PowerShellでデータベースを操作する

Windows PowerShellのコードをいくつか使って、必要な情報を保存するためのデータベースを設定することができます。

ドン・ジョーンズ

データベースはデータ保存の王様です。そこで、SQL Serverのようなデータベースを使って、生活を便利にするための管理情報を保存してはどうでしょうか。サーバー名、Windowsのバージョン、サービスパックのレベル、最終的な管理者ログインなど、様々な情報を保存することができます。
Windows PowerShellを使えば、Microsoft Foundationデータベースの機能にネイティブにアクセスできるため、すべてが非常に簡単です。これは、Windows PowerShellスクリプトというより、C#プログラムのように見えます。しかし、必要なコードは非常に簡単にテンプレート化することができます。いくつかのマイナーな変更で、ほとんどすべての状況に適応させるために、ここで私をあなたに連れて行くことができます。

SQLスクリプトの場合

SYSINFOという名前のSQL Server 2008データベースがあると仮定します。このデータベースには、サーバーの名前を指定するテーブルがあります。このテーブルには、5つのカラムがあります。ServerName、Username、LastLogon、Reason、および SPVersion です。これは、ほとんどが varchar 型の単純なテキスト列でかまいません。
ただし、LastLogonカラムはdatetimeにする。これで、SQL Serverがデフォルト値として設定した関数が使われるようになりました。こうすることで、新しい行を追加するたびに、手動で指定することなく、現在の日付と時刻を含むようになります。Reasonカラムをvarchar(MAX)にし、必要であればテキストを含むことができるように、多くする。
グループポリシーオブジェクト(GPO)にログオンスクリプトを作成し、GPOをサーバーがある組織単位(OU)にリンクさせます。このスクリプトは、誰かがサーバーにログオンするたびに実行されます。Windows PowerShellスクリプトを使用すると、Windows PowerShell 2.0がインストールされている任意のコンピュータで、さまざまなことを行うことができます。Windows Server 2008 R2(またはWindows 7のリモートサーバー管理ツールキットまたはBoarding)からこのGPOを編集するようになったら、Windows PowerShellログインスクリプトオプションに基づくGPOテンプレートがあることを確認する必要があります。
必要なスクリプトはこちらです。ここでエンターキーを押すことを示すために↵を使っていることに注意してください。動作させたい場合は、記号のところに来たときだけエンターキーを押してください(記号 & crarr; 実体を使ってHTMLをコピーすることができます)。

$reason = Read-Host 'Reason are you logging on'↵
$reason.replace("'","''")↵

この2行は、サーバーにログインする理由を尋ねるもので、これを記録しておくことは非常に重要です。replace関数はシングルクォートを2つのシングルクォートに置き換え、後で作成するSQL文が正しく動作することを保証しています。これは意図的なSQLインジェクション攻撃の防止を意図したものではありません。結局のところ、私たちは信頼できる管理者について話しているのですよね?

この行では、オペレーティング・システムに関する情報を取得します。

$os = Get WmiInfo Win32_OperatingSystem↵

ここで重要なデータは、サーバーの名前と現在のサービスパックのバージョンです。また、BuildNumber属性で、扱っているWindowsのバージョンを知りたい場合もあります。
この行は、データベースを処理する.NETフレームワークの一部をロードします。

[assembly.reflection]::loadwithpartialname ('System.Data ') ↵

これらの行は、新しいデータベース接続を作成します。

$conn = New-Object System.Data.SqlClient.SqlConnection↵
$conn.ConnectionString = "Data Source=SQLSERVER;Initial Catalog=SYSINFO;Integrated Security=SSPI;"↵

SQL Server 2008を使用していない場合、接続文字列が少し異なる場合があります(ConnectionStrings.comで、さまざまな異なるデータベースの接続文字列の例をご覧ください)。

$conn.open () ↵

接続が開始され、使用できるようになりました。

作成された2行は、SQLサーバーを使用してクエリを送信するSQLコマンドです。Windows PowerShellが実際にコマンドを送信するように、接続のプロパティを"open"に設定しました。

$cmd = New-Object System.Data.SqlClient.SqlCommand↵
$cmd.connection = $conn↵

これだけ大変な作業です。新しい行を挿入するために、データベース・テーブルにSQL"insert"クエリを作成します。クエリに挿入する4つのメッセージを設定するために、-fフォーマット演算子を使用したことに注意してください。情報は{x}プレースホルダーに挿入され、以下のようにカンマで区切られた演算子のリストで同じ順序を提供します。

$cmd.commandtext = "INSERT INTO servers (servername,username,spversion,reason) VALUES('{0}','{1}','{2}','{3}')" -f
$os.__SERVER,$env.username,$os.servicepackmajorversion,$reason↵

でクエリを実行し、データベース接続を閉じます。

$cmd.executenonquery()↵
$conn.close()↵

必ず接続を閉じないと、データベース管理者の背中に頭をぶつけることになります。ConnectionStrings.comでは、多くのデータベースにアクセスできることがおわかりいただけると思います。
それ以外のSQL Serverを使用する場合は、"OleDb"オブジェクト名 "SqlClient"の部分を変更する必要があるようです。また、ファイルベースのデータベースアクセスのような使い方は、もはや推奨されません。ひとつには、ドライバを入手するために、インストール先でサーバーにアクセスする必要があり、これはひどい話です。もう一つは、これらのデータベースの性能は、これがうまく機能するために必要となるレベルには達していないことです。

データベースをホストできるSQL Serverのインスタンスを持っていない場合は、どこかにエクスプレス版をインストールしてもらいましょう。この手法でトラフィックが発生する可能性は十分に低いです。
もちろん、これを修正して、かなり多くのテクニックを実行することができます。データベースにカラムを追加したり、スクリプトに他の情報を収集させたりすることもできます。必要なことは、SQL言語そのものに熟練することです。マスターである必要はありませんが、基本的なクエリーを書けるようになる必要があります。
SQL言語(ほぼすべての主要なデータベースプラットフォームでこのレベルで動作します)の入門が必要な場合は、業界標準のSQL言語を作成するための完全なチュートリアルを提供するこのビデオシリーズをご覧ください。また、SQL Server、Oracle、MySQLなどのプラットフォーム間の大きな違いもカバーしています。
以下はスクリプトの全体像です。

$reason = Read-Host 'Reason are you logging on'↵
$reason.replace("'","''")↵
$os = Get-WmiInfo Win32_OperatingSystem↵
[assembly.reflection]::loadwithpartialname('System.Data')↵
$conn = New-Object System.Data.SqlClient.SqlConnection↵
$conn.ConnectionString = "Data Source=SQLSERVER;Initial Catalog=SYSINFO;Integrated Security=SSPI;"↵
$conn.open()↵
$cmd = New-Object System.Data.SqlClient.SqlCommand↵
$cmd.connection = $conn↵
$cmd.commandtext = "INSERT INTO servers (servername,username,spversion,reason) VALUES('{0}','{1}','{2}','{3}')" -f $os.__SERVER, $env.username,$os.servicepackmajorversion,$reason↵
$cmd.executenonquery()↵
$conn.close()↵