PowerShell が未来の道であると私は随所に読み続けます。それが最初にリリースされたとき、私はたくさんのバーチャルラボを行いましたが、それ以来、私はまだそれを運用環境で使用していません。 OSが既にインストールされている場所を処理する日が来るのはわかっているので、準備を整えておきたい。
私は知りたいです:
マイクロソフトがこれを強く推進していることに誰もが同意しているようですが、まだ実際に使用している人はいません。毎日のタスクを実行し、いくつかのコードサンプルを共有するためにそれを使用しているシステム管理者から連絡をもらいたいです。
マイクロソフトは、PowerShellをあらゆる場所のパワーユーザーとオートメーションライターの選択肢とするためにできる限りのことをしています。同じことをするために.NETでコードをコンパイルする時代は終わりました。今は、notepad.exeとgoogleが必要です。特にExchange 2007の管理コンソールには、PowerShellで実行できるすべての機能が含まれていないため、私たちはオフィスでそれを大いに愛しています。 Microsoftは意図的に実装することに失敗しました。これは、たまに一度しか実行されず、その方法で開発する方が簡単です。これにより、複雑な環境に似たものがある場合に、その使用が強制されます。
Microsoftの新世代の製品(Win7、Windows Server 2008、Exchange 2007/2010、SQL Server 2008)の管理には、すべて非常に豊富なPowerShellフックがあります。リモートPowershell(PowerShell 2.0 IIRC)がServer 2008 R2と共に展開されると、オートメーションライターにとってさらに便利になります。
私たちがそれでやったこと:
そうです、PowerShellはかなり長い間私たちと一緒にいるでしょう。
[〜#〜] edit [〜#〜]:リクエストされたため、コードサンプルを追加
$ list = import-csv( "groupusers.csv") $ lastseengroup = $ list [0] .group $ ADGroupPrefix = "grp.netware。" $ ADGroupSuffix = 「{編集済み-、ou = groups、dc = domain、dc = domain、dc = domain}の形式で」 Clear-Variable memberlist Clear-Variable unknownusers foreach($ list in $ list){ if($($ entry.group)-ne $ lastseengroup){ echo "stumbled across new group $($ entry.group)、commiting changes to $ lastseengroup " $ newgroup = $ ADgroupPrefix + $ lastseengroup $ newgroupdn = '"' + "cn = $ newgroup $ ADGroupSuffix" + '"' echo" DNを取得しています$ newgroup " $ existinggroup = dsquery group domainroot -name $ newgroup if(($ existinggroup -ne $ null)){ dsmod group $ newgroupdn -chmbr $ memberlist } else { dsadd group $ newgroupdn -scope u -secgrp yes -members $ memberlist -desc "Group imported from eDirectory" } Clear-Var iable memberlist } $ User = get-user $($ entry.member)-ErrorAction SilentlyContinue if($ User.isvalid){ $ UserDN = $ User.distinguishedname $ memberlist = $ memberlist + '"' +" $ UserDN "+ '"' } else { $ unknownusers = $ unknownusers + $($ entry.member ) } $ lastseengroup = $($ entry.group) } dsadd group "cn = $ ADGroupPrefix $ lastseengroup $ ADGroupSuffix" -scope u -secgrp yes -members $ memberlist
これは、Perlスクリプトで作成されたCSVファイルを受け取り、一連のグループを更新します。グループがすでに存在する場合は、メンバーシップをファイルで指定されたメンバーシップに置き換えます。グループが存在しない場合は作成します。これは一方向の同期です。また、まだquiteは本番環境ではありませんが、終了しています。
Microsoftのサーバー製品が最初からPowerShell対応になることを考えると(Exchangeの次のバージョンにはallPowerShellを介して使用できる構成があると思います)、 PowerShell in Practice のような本は、他の単調なタスクを自動化するいくつかの優れた方法を説明しています。PowerShellが、しばらくの間、Windowsサーバーランドで普及しているテクノロジであることを示唆するのは妥当だと思います。
私はお勧めします Scott Hanselman's Podcast#162 。すべてのMicrosoftサーバーチームは、PowerShellコマンドレットを提供し、単一の一貫した構文に従うことを「強制」されているようです。
また、 VMWare のようなサードパーティが採用しています
つまり、2.0以降のPowerShellは、最も重要なタスク以外のすべてのバッチファイルを置き換えるビジネスに真剣に取り組んでいると思います。
SQL Serverデータベース管理者として使用する10個のPowerShellスクリプト(すべては my blog で説明/投稿されています):
どのような種類の管理タスクをスクリプト化しましたか?
アプリケーション/サービスの監視:(リモートの)イベントログとストアドプロシージャから主要なパフォーマンス値を取得し、単一のバッチファイルから表示する
私はSQL ServerのDBAです。これを使用してクールなことをいくつか示してください
automssqlbackup :ローテーションを伴うMSSQLの毎日のバックアップ(daily = incremental、weekly + monthly = full; 5つの毎日のバックアップ、5つの毎週のバックアップを保持)、zip、電子メール通知
以前のキャリアでUNIXシェルスクリプトを使用してから、Windowsサーバー管理に移行したので、Powershellに本当に感謝しています-あまりにも難解な構文を習得する時間も能力もありません。非常に単純な言語で記述できるpowershellスクリプトの数... kshに慣れていたので、それだけの価値があります。
私はそれが長い間存在するであろうと予測しています。
これはクールだと思いました。SQLServer 2008では、ローカルファイルシステムやレジストリと同じようにSQLデータベースをナビゲートできる新しいPowerShell拡張機能を利用できます。
SQL Serverクライアントツールをインストールしたら、PowerShellで任意のデータベースを開き(右クリックのコンテキストメニューを使用)、オブジェクト指向の方法でデータベースを操作できます。
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\ExampleDB\>function Prompt {"PS >"}
PS >cd tables
PS >dir
SCHEMA NAME CREATED
------ ---- -------
dbo MyTable 25/06/2009 17:02
PS > dir | format-table name, columns, rowcount, parent
NAME COLUMNS ROWCOUNT PARENT
---- ------- -------- ------
MyTable {Id, Name} 0 {ExampleDB}
PS >$myTable = dir | where {$_.Name -eq "MyTable"}
PS >$myTable.Script()
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[MyTable](
[Id] [int] IDENTITY(1,1) NOT NULL
[Name] [nText] NOT NULL
) ON [PRIMARY]
PS >set-location \SQL\AnotherServer\Default
PS >cd databases\Northwind\tables
PS >$myTables = dir | where {$_.Rowcount -gt 100 -and $_.HasIndex -eq 1}
PS >$myTables.Count
8
PS >foreach ($table in $tables) {$table.RebuildIndexes(90)}
最初の行は単にプロンプトを変更するので、それほど長くないことに注意してください。
それとは別に、ここで何が起こっているのかは自明です:)
SQL Server 2008では、Management StudioにPowerShellコンテキストオプションが追加されたため、Exchange以外にもそれを採用しています。また、MSが後方互換性の問題でDOSのセキュリティを向上させることができないため、MSが考えていたものとほぼ同じであるため、DOSの代わりと考えてください。
私もDBAであり、長い間スクリプト作成者であり、DOSバッチファイルV3.3に戻っています。 VBスクリプトに移動しましたが、PSはvery強力です。ご覧ください-新規ユーザーなので、リンクを投稿できません。これはOtto Helwegのブログから入手した、安価で明るいソフトウェアインベントリツールです。
PowerShellスクリプトの例:
# Open the database connection
$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()
# Get all known computers
$sqlQuery.CommandText = "select * from Inventory..Computers"
$reader = $sqlQuery.ExecuteReader()
$computersToQuery = @()
while ($reader.Read()) {
$computersToQuery += $reader["Computer"]
}
# Close the database connection
$dbConn.Close()
$softwareInventory = @{}
foreach ($computer in $computersToQuery) {
$psinfoOutput = ./psinfo.exe -s Applications \\$computer
$foundSoftwareInventory = 0
$computerName = ""
foreach ($item in $psinfoOutput) {
if ($foundSoftwareInventory -eq 1) {
# Force the results to a string
# Remove any single quotes which interfere with T-SQL statements
# Load the result into a hash whereby removing any duplicates
[string]$softwareInventory[$computerName][$item.Replace("'","")] = ""
}
if ($item -like "System information for *") {
$computerName = $item.Split("\")[2].TrimEnd(":")
} elseif ($item -eq "Applications:") {
$foundSoftwareInventory = 1
$softwareInventory[$computerName] = @{}
}
}
}
$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()
foreach ($computer in $softwareInventory.Keys) {
foreach ($softwareItem in $softwareInventory[$computer].Keys) {
"Loading-" + $computer + ":" + $softwareItem
# Try an Update then an Insert
trap {
$sqlQuery.CommandText = "update Inventory..SoftwareInventory set AuditDate = getdate() where Computer = '" + $computer + "' and Software = '" + $softwareItem + "'"
$result = $sqlQuery.ExecuteNonQuery()
continue
}
$sqlQuery.CommandText = "insert into Inventory..SoftwareInventory (Computer,Software,AuditDate) values ('" + $computer + "','" + $softwareItem + "',getdate())"
$result = $sqlQuery.ExecuteNonQuery()
}
}
$dbConn.Close()
デイブJ
次のタスクは、PowerShellを使用して非常に定期的に私のチームによって実行されます
毎日、私はPSプロンプトを常に表示していて、CMDを使用していた1回限りのタスクにそれを使用しています。
以下は、Sharepointリストを読み取るためのコードサンプルです。 SharePointのWebサービスとPowerShell V2.0の新しい「New-WebServiceProxy」コマンドレットを使用しています
$url = "http://server/sites/site/_vti_bin/lists.asmx"
$listWebService = new-webServiceProxy -uri $url -UseDefaultCredential
$listName = "MyList"
$viewGuid = $null
$query= $null
$viewFields = $null
$numRowsReturned = 20000
$queryOptions = $null
$result = $listWebService.GetListItems($listName,$ViewGuid,$query,$viewFields,$numRowsReturned,$queryOptions,$null)
Oisin Grehanが Sharepoint Webサービスの使用に関する素晴らしいブログ投稿 を持っているので、すべての機能を作成するためのベースとして使用しました。彼は、PowerShell V1をまだ使用している場合に使用できる、すばらしいnew-webservice.ps1スクリプトを用意しています。
また、これは、クラスタ内のノードで使用可能なメモリを取得するために使用した基本機能です
Function Get-AvailableMemory {
param
(
[string[]]
$servers
)
BEGIN {
$query = "select AvailableBytes,__SERVER from Win32_PerfRawData_PerfOS_Memory"
$availableMemory = @{
Name="AvailableMemory";
Expression = {[math]::round($_.AvailableBytes/1gb,2)}
}
$serverName = @{
Name ="Server";
Expression = {$_."__SERVER"}
}
}
PROCESS {
foreach ($server in $servers){
get-wmiobject -query $query -computer $server |
select-object $availableMemory, $serverName
}
}
END {}
}
仕事で小さなプロジェクトにPowerShellを試してみました-企業からの〜600ユーザーと〜200グループのサブセットの毎日の移行 [〜#〜] ad [〜#〜] から古いUNIXシステムへ [〜#〜] csv [〜#〜] のようなファイルを使用します。 500行の VBScript スクリプト(!)が提供され、開始点として単一のグループとそのユーザーを引き出しました。
最大20行のPowerShellスクリプトですべてを実行できることがわかりました...
* NIXユーザー(サーバーおよびクライアント側)として、私はPowerShellに非常に嬉しく驚いています。コマンドの小さなサブセットを知っていても、それを使用して非常に強力な作業を行うことができます。必要なのは [〜#〜] ssh [〜#〜] (-like)リモートアクセスだけです...
どうすれば使用できませんか?現在リリース中またはアップグレード中のすべてのMicrosoftサーバーアプリケーションは、Powershellを使用して管理されます。多かれ少なかれ迷惑なUI /管理コンソールがこのコアの上に構築されて提供されますが、これは非常に遅いことが多く、誰かが指摘したように、利用できる機能が不足しています...実際に多くの選択肢があるとは言えません^ ^
Powershellは完璧ではありませんが、これを使用したことがあれば、かなりクールだとわかります。 .netライブラリ全体と組み込みのコマンドレットにアクセスできる(そして、2.0でPSを使用して独自のコマンドレットを作成できる)ことは、非常にすばらしいことです。
欠けていると思うのは、よいIDEです。これは、いつかMSから提供されると確信しています。現在、Ideraのpowershell plusとadminscripteditorを使用しています。デバッグが可能で、かなりクールです。 。
私はVBからかなり離れることができました。
今日までの私の最大のプロジェクトは、「powershellASP」を使用して、Powershellコマンドを実行し、vmwareホストとVM情報を12を超えるVMWare ESXiから取得する(無料)の基本的なWebページを作成することです。ホストし、HTMLテーブルに表示します。これは、無料のVMWare ESXiと仮想センターがないため、社内のすべてのVMのリアルタイムの概要を取得する方法が他にないためです。PowershellASPは、 IISであり、MSではサポートされていません。そのため、現時点ではいくつかの制限された処理を実行でき、ドキュメントはかなり疎です。
ADを介してさまざまなものを検索し、WMIを介してサーバー上の共有、ディスク領域、使用済みディスク領域などの重要な統計情報を照会する管理/インベントリスクリプトがたくさんあります。
一般的なスクリプト:
ユーザースクリプト:
ESXサーバー上のすべてのVMWareゲストマシンを列挙するものがあります
X日後にファイルを取得して安全に削除するスクリプトがあります。
基本的に、VBScriptで約200行かかっていたことができ、PowerShellの10行で実行できます。スクリプトの結果を送信するために定期的に行う、添付ファイル付きの電子メールの送信など、VBScriptで実行できない、または実行できないことも実行できます。また、カスタムサービス名とイベントIDを使用して、意味のある一意のエントリをイベントログに書き込むことができます。
それは私が頭の上から考えることができることです。私が選択したツールはPowerShellですが、これにより作業が簡単になります。
基本的に、BashスクリプトはUnix管理者にとっても、システム管理者にとっても同じくらい便利です。
私のWindows管理者はまだPowerShellを使用していません。彼らはすべてそれを聞いたことがありますが、慣れるまでに時間がかかりません。
自分で見てみることにしました。 Unixシェルのバックグラウンドから来た私は、Windowsが最終的に本物のシェルプログラミング環境を備えている必要があると思いました。 MicrosoftはPowerShellでうまくいったこともあれば、そうでないこともあると思います。
良い面は、PowerShellのコマンドレット間の仲介としてのオブジェクトの使用です。これにより、PowerShellにある程度のパワーがもたらされます。テキストベースのスクリプトは、機能するためにハッキングする必要があります。
マイナス面としては、Unix Shellコマンドの多くを実際には活用していません。したがって、学習曲線は不必要に急勾配であり、人々がUnixからPowerShellに、またはその逆に簡単に移行するのに役立ちません。ほとんどの場合、 ls エイリアス Get-ChildItem などの一部のPowerShellコマンドレットのエイリアスを定義し、コマンドラインスイッチはすべて異なります。
ちょうど私の2セント...
私が作業しているサーバーの診断(WMIからの基本情報の収集、およびイベントログからのエラーと警告の収集)を使用して特定の項目を自動化します。
イベントログの処理は素晴らしいです。
私は最近、スクリプトが実行されているドメイン全体でFoxit Readerがデフォルトで有効にしている自動更新ポップアップを無効にするスクリプトを書きました。 ADからコンピューターのリストをプルし、それがアップしているかどうかをテストしてから、1を0に変更します。
忘れてしまったことが一つ!
ほとんどの場合、.NETライブラリへの完全なアクセス権があります。本当に複雑なことをするのは少し面倒ですが、必要があればそれはあなたのためにあります。
私は.NET開発者ではないため、PSで使用できるすべての.NET関連の機能の使用を制限しています。ただし、(特に)Exchange管理者である場合、Exchange 2007のPowerShell統合は非常に優れています。ようやく、メールシステム用の信頼できるスクリプトエンジンができました。これまでのところ、すべてのメールボックスの毎月の統計情報を送信し、時間に応じて割り当てられるさまざまな電子メールアドレスを調整し、パブリックフォルダーに対する権限を自動的に作成して割り当て、2つのメールメールボックスDB間でユーザーを負荷分散しています。 Ex07の観点から見たもう1つの優れた点は、GUIで何かを実行すると、実行した内容に関連するPowerShellコマンドが表示されることです。それらをコピーすると、最終的には、Exchange環境をゼロから再構築できる一連のPSスクリプトが作成されます。
クライアントバッチスクリプト(実行中のプログラム、ログオンスクリプトなど)を置き換えるためにpoweshellを探していました。
しかし、それはログオン時間に少なくとも10秒を追加することがわかりました-それはすべての「微調整」が整っていることです。そのため、私たちが使用していたものをそのまま使用することになりました。
それはピックアップするのが最も簡単なスクリプト言語ではありませんが(パイプでの確かな経験と推定されます)、独自の奇妙な力を持っています(私にを与えてください)シンプルsed -likethingy !!)、PowerShellは非常に強力です。 Bash や他のUnixシェルのレベルまでではありませんが、まだです。
私はそれを使用して、問題が発生した場合に備えて、電子メール警告でいくつかのデータベースのエクスポートとインポートを監視し、いくつかの定期的なバッチ操作を実行しています。
これは確かに既に私の主要なWindowsシェルですが、実際には "write less do more"のようなものではありません。 PowerShellは、その冗長性(および.NET継承)に反しています。
私たちはそれをかなりの数の管理タスクに使用しています。古いファイルのクリーンアップやマシンのデフラグや結果の記録など、一部のスクリプトは単純です。 1つのスクリプトは、主にWMIを使用してコンピューターを監査し、その結果をデータベースに記録します。ハードウェア(CPU、RAM、ドライブなど)、ネットワーク情報、ローカルユーザー、インストールされているソフトウェア、プロファイル情報などを取得します。電子メールを送信するためにWebサービスを呼び出すものがあります。将来的には、まだ使用されている残りの VBScript スクリプトが置き換えられると思います。 ExchangeまたはSQL Serverのタスクにはまだ使用していません。
バックグラウンドジョブ、トランザクション、優れた例外処理、新しいISE(統合スクリプト環境)、より優れたデバッグなどをサポートする次のバージョンを楽しみにしています。
PowerShellバージョン1.0は多くの面で非常に制限されていましたが、バージョン2.0は順調に進んでいます。バッチスクリプトと比較して、はるかに強力です。私は実際にはスクリプトとしてのみシェルとして使用することはないため、私の経験はそれに応じて色分けされています。構文(-eq
対==
、-gt
対>
など)ですが、何か変なことが必要な場合は 。NET にドロップできることに感謝しています。バージョン3.0までには素晴らしいと思います。今は「仕事を終わらせる」というカテゴリーにしっかり入れます。
主にコードのデプロイメントを自動化するために使用します。これは、C#で何かを作成することに光を当てる領域です。再帰的なディレクトリコピーや、Bashスクリプターが長年にわたって当たり前にしてきたことなど、シェル関連の操作により、処理が非常に簡単になります。
これは開発者向けの回答ですが、現実の世界であり、今後数か月のある時点でテストを開始します。 SQL Serverタスクを 継続的インテグレーション 環境に取り込むためのスクリプトを書くために、PowerShellを学び始めています。継続的インテグレーションスクリプトは、主に NAnt および MSBuildJetBrains TeamCity によって実行されます。
それに加えて、私は、一般的な目的、特にSQL Serverデータベースの管理タスクのために、主要なWindowsコマンドシェルとしてPowerShellに切り替えることを検討しています。
まだ学習しているため、共有するコードサンプルはまだありません。私がそうするとき、私はいくつかを投稿させていただきます:)
これは、私があなたの別の質問に答えたばかりの1行のコードサンプルです:)しかし、ねえ、wikiのために...
インストールされている修正プログラムが一覧表示されます。
Get-ChildItem -Path “HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix”