こんにちは。
コミュニティ関連が続きまして恐縮です。
新コミュニティ発足のご連絡をいただいたので、この場をかりてご紹介します。
その名も
Windows Server 2008 ユーザーアカウント移行コミュニティ http://groups.msn.com/admt2008/
うわー濃いコミュニティだなぁ....怖いです。
オーナーの木下さん曰く、
仕事柄 お客様システムの移行をする機会が多いのですが、情報が少なくて困ることもしばしば...情報が無いなら自分が作っちゃえ!ということでコミュニティを発足しました。世の中の移行経験者の方々と情報交換をしつつ、失敗しない移行方法を模索したいです。
とのこと。
興味のある方は GO! です。
あ、ちなみに、ROM禁止(笑) とのことです。
それにしても...このように、少しずつでも情報発信していただける方が増えるというのは、とてもうれしいことです。
み���さんもいかがでしょう、ご自分の得意分野でコミュニティを作ってみませんか?ニッチでよいのです。
情報発信者に情報は集まる と言われます。普段の業務では得られない情報や、人とのつながりができるはず!
リーマンブラザーズって聞くと、デビュー当時の東京プリンを思い浮かべるのは私だけでしょうか?
さて、ちょっと実験的な試みなのですが、Windows Server 2008 リソースキット コミュニティ 研究会 を MSNコミュニティ内に発足(ってほどたいそうなものではありませんが)しました。
Windows Server 2008 リソースキットコミュニティ 研究会http://groups.msn.com/ws2008reskitlab/
【活動内容】
【活動拠点】
【参加条件】
特にありませんが、小さな成果を少しずつ出せるコミュニティを目指しています。
そういう意味では、「AD に詳しい」こともある程度重要ではあるのですが、情報発信に関するモチベーションをお持ちの方に参加いただけるとうれしいです。
「まだ勉強中だけど半年で追い付くのでそれでもよい?」に対しては「もちろんです!」とお答えします。
【コミュニティリーダーについて】
現在、暫定的に私がコミュニティリーダーになっています。
が、現場の方で、リソキをもっと使いこなしたい、リソキをよりよいものに変えていきたい!という想いをお持ちの方に是非ともリーダーになっていただきたいと考えております。
いかがですか?どなたか、一歩踏み出してみませんか? きっと新しい世界が開けます。
いかがですか?どなたか、一歩踏み出してみませんか?
きっと新しい世界が開けます。
入社して1.5年、いつか体が勝手に覚えてくれると思ってノホホーンとしていた「英語」ですが、いやー全く覚えてくれませんね。
大誤算でした。外資だと思ってなめてました。
いまだに、Windwos とか書いといて気付かないという体たらくです。
そこで一念発起です。
MS 社内で流通している英単語に注力してみよう!プロジェクトの発足です。
社内のメーリングリストに流れているメールから英単語を抜き出して、頻出リストを作ることにしました。
どうやるか。
テキストマイニング?ピボットテーブル?そんなものは知りませんし、見たこともありません。必殺技の名前でしょうか?
私のツールは昔から vbscript だけって決まってるんです。
結果出来上がったのが、以下のスクリプトです。あまりのベタさに恥ずかしすぎてお見せしたくないのですが、何かのヒントになるかと思い、赤面しながらの放出です。
何をやっているかは一目瞭然です。
読みこんだテキストからいらない文字を片っ端から半角空白に置き換え、 半角空白でSplit し、 あとはひたすらループで数を計算
はずかしいです。
工夫した点は...あえて言えば、色分けした部分でしょうか。Dictionaryオブジェクトを使用して、同じ単語が出てきたらカウントアップしています。
3行目の「<テキストファイルを指定>」とあるところには、テキストファイルを指定してください。OUTLOOK を使っている方であれば、[ファイル]メニューの[インポートとエクスポート]から、フォルダ全体を一括でテキストファイルに保存できます。
ForReading = 1 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile =objFSO.GetFile("<テキストファイルを指定>") Set objTS = objFile.OpenAsTextStream(ForReading, 0) r = objTS.ReadAll
r = replace(r, "(", " ") r = replace(r, ")", " ") r = replace(r, "/", " ") r = replace(r, "=", " ") r = replace(r, ".", " ") r = Replace(r,chr(9)," ") r = Replace(r, "," ," ") r = Replace(r, ":", " ") r = Replace(r, ";", " ") r = Replace(r, """", " ") r = Replace(r, "“", " ") r = Replace(r, "”", " ") r = Replace(r, "’", " ") r = Replace(r, "?", " ") r = Replace(r, "!", " ") r = Replace(r, "$", " ") r = Replace(r, "\", " ") r = Replace(r, "%", " ") r = Replace(r, "*", " ") r = Replace(r, ",", " ") r = Replace(r, "[", " ") r = Replace(r, "]", " ") r = Replace(r, "{", " ") r = Replace(r, "}", " ") r = Replace(r, " ", " ") r = Replace(r, "|", " ") r = Replace(r, "~", " ") r = Replace(r, "‘", " ") r = Replace(r, "+", " ") r = Replace(r, "<", " ") r = Replace(r, ">", " ") r = Replace(r, "…", " ") r = Replace(r, "&", " ") r = Replace(r, "-", " ") r = Replace(r, "1", " ") r = Replace(r, "2", " ") r = Replace(r, "3", " ") r = Replace(r, "4", " ") r = Replace(r, "5", " ") r = Replace(r, "6", " ") r = Replace(r, "7", " ") r = Replace(r, "8", " ") r = Replace(r, "9", " ") r = Replace(r, "0", " ") r = Replace(r, "_", " ") r = Replace(r, "@", " ") r = Replace(r, " ", " ") r = Replace(r, vbCr, " ") r = Replace(r, vbLF, " ") r = Replace(r, vbCrLf, " ")
arrR = split(r," ")
wscript.echo UBound(arrR)
Set objDic = CreateObject("Scripting.Dictionary") Set objDicCount = CreateObject("Scripting.Dictionary")
For each n in arrR n = UCase(trim(n)) If len(n) >1 and IsNull(n) = False then If not objDic.Exists(n) then objDic.Add n,1 Else objDic.Item(n) = objDic.Item(n) + 1 End If End if Next
Wscript.Echo objDic.Count objKeys = objDic.Keys objItems = objDic.Items
For i = 0 To objDic.Count -1 Wscript.Echo objKeys(i) & "," & objDic.Item(objKeys(i)) Next
このスクリプトを、拡張子 vbs で保存します。
結果を、Excelで読み込み、並べ替えたところ....出ました。
800通のメールを構成する、13000単語から、MS ワールドワイド エバンジェリズムグループ頻出単語一覧 トップ 140 の発表です。
TO と MICROSOFT を抑えて、堂々の一位は THE に決まりました。
注目は、113 位の APPLE と 122 位の IPHONE ですかね。来週はどうなっているでしょう。
このリストを見て思うのは...
THE かよっ!
やる前からわかっちゃいたんですけどね。
人名とかURLなんかもごっちゃになったまま集計したので、ぜーんぜん...ではありませんが、大した意味はありませんでした。
ちなみに、アルファベット順にすると結構よさげなんですけどね。
MCSE を今期の目標の1つにされている方、手を上げてください。
結構いらっしゃいますね。
私も過去にそういう目標を立てた記憶がありますが、だいたい、期末になってあわてるんですよね....で、結局受験しないと...
みなさんには、そんな無残な状況になってほしくありません。
とはいえ、少ない時間で効率的に勉強ができて、かつ合格率をより高くするにはどうしたらよいだろう....
悩ましい問題です。
そんな悩めるエンジニアの皆さんに朗報です。
MCPの試験対策にぴったりの、System Center Operations Manager 2007 自習書シリーズ (全8章)が公開されました。
System Center Operations Manager 2007 自習書シリーズ http://technet.microsoft.com/ja-jp/opsmgr/cc979328.aspx
某有名講師が開発したこの自習書シリーズで勉強すれば、一発合格間違いナシ...とまでは言いきれませんが、かなりポイントをついた学習ができるはずです。
もし、普段の業務でOperations Managerを触る機会が無いという方は、自習書に合わせて Virtual Lab も活用してください。ブラウザからマイクロソフトサイトに接続してOperations Manager 2007 の実機が触れるという、すぐれものです。
System Center Operations Manager 2007 バーチャルラボ http://www.microsoft.com/japan/technet/traincert/virtuallab/systemcenter.mspx
※2008年9月1日時点で「イントロダクション」の演習が行えないという不具合が発見されましたが、2008年9月16日付で解消されました
そういう私は、もう何年MCP試験を受験していないだろう...
思えば、一番最初に受かった試験は、SMS 1.2 でした。なんか、かなりギリギリで合格した記憶があります。
過去、一番手ごわかった試験は...Windows95 じゃなかったかな...これもギリギリで合格した記憶があります(恥)。
うーむ、久しぶりに挑戦しようかな。
その前にTOEICかな...などと悩む今日この頃です。
2008年9月29日発売予定の Widnows Server 2008 Active Directory リソースキットの監訳に続き、Group Policy 編の監訳を進めています。
2008年11月発刊予定です。
ただ、先週、体調を崩しまくり、すこーし?だけ私の作業が遅れています。
この週末に追いつくはずだったのですが、うーん、ちょっと追いついていません。
今週1週間が勝負だと考えています。
なぜならば、今週で目途を立てないと、夏休みがとれません!
それにしても、このGroup Policy リソースキットも内容が濃いです。
英語版でも 500P以上あります。日本語版では、はたして...。
で、ですね。
監訳が終わって、めでたく発刊されたら、リソキをベースにしたセミナーをやりたいと考えています。
リソースキットはご存知の通り、読むためのスキルも必要です。
決してビギナー向けでは無いんですよね。
なので、「リソキを読み解くためのセミナー」をやりたいなと...考えています。
漠然としていますが。
ただ、これ、私だけが話すのはもったいないので、同志を募集中です。
「この章はまかせろ!」「この分野ならいくらでも話せる!」「というか、俺にやらせろ」「とにかくしゃべらせろ」
という方がいらっしゃるはずです。
時期は、11月半ばに計画しています。
また追って募集したいと思います。
講師をしてもよい!という方。
是非ともコンタクトください。
DPM2007シリーズもそろそろ終盤です。
前回までで、DPMのエージェントインストールまでが完了しました。
ここからは保護グループの作成を行うのですが、ちょっと複雑なので、まずは保護グループの情報取得、つまり設定内容を参照する手順を通して、オブジェクト構造のイメージをつかんでください。
保護グループのバックアップと回復に関するポリシーには、バックアップの頻度や回復の長期的要件および短期的要件に関する情報が格納されています。管理コンソールの設定画面で見ると、以下のような情報です。
ファイルサーバーに関する保護ポリシー
SQL Server に関する保護ポリシー
上記の保護ポリシーの情報を取得するには、保護グループのインスタンスを Get-PolicyObjective コマンドレットに渡します。
さっそく管理シェル上で保護グループの保護ポリシーを取得してみます。
ここでは、上の2つ(ファイルサーバーとSQL Server)に関する保護ポリシーを取得してみます。
まずは、保護グループのインスタンスを取得します。おなじみの方法ですね。DJ-DPM01 はDPMサーバー名です。
PS C:\> $PG = Get-ProtectionGroup DJ-DPM01 PS C:\> $PG
Name Protection method ---- ----------------- ProtectionGroup01 短期的 (ディスクを使用) ProtectionGroup02 短期的 (ディスクを使用)
次に、それぞれの保護グループ(ProtectionGroup01 と 02)の保護ポリシーを取得します。
保護ポリシーの取得は、Get-PolicyObjective を使用します。注意しなければならないのは、Get-PolicyObjective に渡せるのは1回に1つの保護グループだけです。
PS C:\> Get-PolicyObjective -ProtectionGroup $PG[0] -ShortTerm
Retention Range Synchronization Frequency --------------- ------------------------- 5 日 15 分ごと
PS C:\> Get-PolicyObjective -ProtectionGroup $PG[1] -ShortTerm
ひとまずこれで終わりなのですが、正直、なんのこっちゃ?ってかんじですよね。上の図と照らし合わせてみても、まったく情報が足りません。
もうすこし掘り下げましょう。
◆「保存期間」の取り方
「保存期間」は、Get-PolicyObjective コマンドレットのメソッドである、Get-RecoveryRange() を使用します。以下の例では、$PG[1] つまりProtectionGroup02 の保存期間を取得しています。注目していただきたいのは、Get-RecoveryRange()に対して、さらにRangeプロパティ、およびUnitプロパティを使用しているところです。Get-RecoveryRange()で取得しただけでは、使い勝手が悪いですよね。なので、「期間(range)」と「単位(Unit)」それぞれを個別に取得しています。
PS C:\> $PO_1 = Get-PolicyObjective -ProtectionGroup $PG[1] -ShortTerm PS C:\> $PO_1
PS C:\> $PO_1.Range PS C:\> $PO_1.Get_RecoveryRange()
Range Unit ----- ---- 5 Days
PS C:\> $PO_1.Get_RecoveryRange().Range 5 PS C:\> $PO_1.Get_RecoveryRange().Unit Days PS C:\>
◆同期のスケジュール~ファイルサーバーの「同期の間隔」と「ファイルの回復ポイント(シャドウコピー)の作成時間」の取り方
同期の間隔を取得するには、Get-Schedules() メソッドを使用します。
以下は、ファイルサーバーを含んだ保護グループの同期スケジュールを取得して表示したものです。 同期間隔が15分と表示されているのに加えて、シャドウコピーの作成時間も表示されています。ファイルサーバーの場合、「同期」とは「NTFS ジャーナルファイル」の同期を意味し、回復ポイントが作成されるわけではないことに注意する必要があります。じゃ、NTFS ジャーナルファイルってなんで同期してるの?ってことになりますが、NTFSジャーナルファイルを使用して、手動で回復ポイントを作成することができます。管理者が、「あ、そうだ、今の時点で回復ポイントを作っておこう」という意思に基づき手動で(もちろんスクリプトも可能)回復ポ��ントを作成しなければ、「ファイルの回復ポイント(以下の出力では、「シャドウコピー」と表示されています)」のスケジュールでのみ回復ポイントが作成されます。
PS C:\> $PO_0.Get_Schedules()
Schedule type Schedule ------------- -------- 同期 15 分ごと シャドウ コピー 0:00、 1:00、 8:00、 12:00、 18:00 ...
ちなみに、以下の画面を見てください。回復時間に表示されているのは、上の出力結果である、0:00/1:00/8:00/12:00 であることがわかります。15分ごとに回復ポイントが作成されているのであれば、回復時間の一覧には、0:00/0:15/0:30。。。。などぞずらっと回復ポイントの一覧が表示されるはずですが、そうではありません。
さて、PowerShellの話に戻ります。上記のままでは、プログラム上、使い勝手が悪いので、もっと細かな単位で取得したいですね。そこで、 Get_Schedules() メソッドを使用して、一旦スケジュールのインタンスを取得します。
PS C:\> $objShc = $PO_0.Get_Schedules()
$objSch には、「同期」のスケジュールと 「シャドウコピー」のスケジュールが格納されているので、アレイ値であることが予測できます。
それぞれの JobTypeプロパティを見てみましょう。「同期」は「Replication」、「シャドウコピー」は「ShadowCopy」というJobTypeで識別されていることがわかります。$objSch のインデックスに注意しながら見てください。「0」がReplication、「1」がShadowCopy であることがわかります。
PS C:\> $objSch[0].JobType
Replication
PS C:\> $objSch[1].JobType
ShadowCopy
PS C:\> $objSch[0].JobTypeString
同期
PS C:\> $objSch[1].JobTypeString
シャドウ コピー
Replication、ShadowCopy それぞれのJobType のタイミングを見てみます。
JobType = Replicaton のタイミングは、Frequency プロパティで参照します。
PS C:\ $objSch[0].Frequency
15
PS C:\
JobType = ShadowCopy のタイミングは TimesOfDay プロパティ および TimesOfWeek で参照することができます。 冒頭の画面「ファイルサーバーの保護ポリシー」と比較してみてください。
TimesOfDay には今日の日付も入っていることがわかります。これは、当日分のスケジュールに展開して表示されるためです。
設定を行った時間に影響されているのか、もしくはオフセットとして自動的に設定されたものなのか、「4分」という微妙なずれが見ているのが気になりますが...(笑)。
PS C:\> $objSch[1].TimesOfDay
2008年9月12日 8:04:00 2008年9月12日 1:04:00 2008年9月12日 12:04:00 2008年9月12日 0:04:00 2008年9月12日 18:04:00
PS C:\> $objSch[1].WeekDays
Mo Tu We Th Fr Sa
PS C:\>
もうお気づきかと思いますが、TymesOfDay および WeekDay も複数値です。よって、以下のように個々の設定値を取りだすことができます。
PS C:\> $objSch[1].TimesOfDay[4]
2008年9月12日 0:04:00
PS C:\> $objSch[1].WeekDays[3]
We
# はぁぁぁ、長かったですね。構造について、なんとかご理解いただけましたか?
# 休むと余計に疲れるので、続けましょう。
さて、一方、以下はSQL Server を含んだ保護グループの同期スケジュールを取得して表示したものです。同期間隔が15分と表示されているのに加えて、高速完全コピーの作成時間も表示されています。SQL Server をはじめとするアプリケーションサーバーの場合、ファイルサーバーのバックアップとは「同期」の意味が異なります。アプリケーションサーバーでは、「同期」=「回復ポイントの作成」を意味しています。「高速完全バックアップ」については、ご存じの通り「フルバックアップの再作成」です。よって、ファイルサーバーのように単にジャーナルファイルが同期されるわけではなく、きちんと回復可能な状態として保存されます。
PS C:\> $PO_1.Get_Schedules()
Schedule type Schedule ------------- -------- 同期 15 分ごと 高速完全 20:00 月、 火、 水、 木、 金、 土
以下の画面を見てください。SQL Server の回復画面です。ファイルサーバーとは異なり、同期の間隔(15分)単位で回復ポイントが作成されていることがわかります。
それでは、ファイルサーバー同様、GetSchedules() メソッドで取得した値を、細かく掘り下げてみましょう。
まずは、JobType です。同期が「Replication」であることはファイルサーバーと同様です。高速完全バックアップは「FullReplicationForApplication」という識別名で識別されていることに注意してください。
PS C:\> $PO_1.Get_Schedules()[0].JobType
PS C:\> $PO_1.Get_Schedules()[1].JobType
FullReplicationForApplication
PS C:\> $PO_1.Get_Schedules()[0].JobTypeString
PS C:\> $PO_1.Get_Schedules()[1].JobTypeString
高速完全
回復ポイントの取得間隔(Frequency)や、高速完全バックアップの取得時間(TimesOfDay)、および高速完全バックアップの実施曜日(WeekDays)についてはファイルサーバーの場合と同様ですので、以下をご覧ください。
PS C:\> $PO_1.Get_Schedules()[0].Frequency
PS C:\> $PO_1.Get_Schedules()[1].TimesOfDay
2008年9月12日 20:00:00
PS C:\> $PO_1.Get_Schedules()[1].TimesOfDay[0]
PS C:\> $PO_1.Get_Schedules()[1].WeekDays
PS C:\> $PO_1.Get_Schedules()[1].WeekDays[4]
Fr
ということで、長くなりましてすみません。
以前投稿した、以下の記事の続きです。
その2の②において、DPMサーバーに保護サーバーを認識させる際に、Attach-ProductionServer.ps1 を使用しました。これは、DPM で提供されているスクリプトです。
じゃ、この中身はどうなっているのか、せっかくなので見ておきましょう。
これはよいですね。おなじみの引数の設定です。
ここも大丈夫ですね。おなじみ、 DPMサーバーが引数として指定されていなければ、プロンプトを出してDPMサーバーの入力を求めています。
もし、-? または -help が引数として指定されていれば、書式を表示しています。
以下も、引き続き、引数チェックをしています。
DPMサーバーに接続しています。ここで取得した $dpmserver オブジェクトが重要ですので覚えておいてください。
ここです。上で取得した $dpmServer のメソッドである、 「AttachProductionServer」を使用して、保護サーバーをDPMサーバーにアタッチしています。これがうまくいくと、DPM管理コンソールのエージェント一覧に、保護サーバーがリストされます。
#Call Attach production server method on DPM server $dpmServer.AttachProductionServer($PSName, $UserName, $Pwd, $Domain)
以下は、エラーが発生した場合の処理です。エラー番号やメッセージを画面に表示します。
最後に、DPMサーバーとの接続を解除して処理完了です。
#Dispose DPMserver object if ($dpmServer) { $dpmServer.Dispose() } Write-Host "Attached ProductionServer successfully" -ForeGroundColor Green
大したスクリプトじゃなかったですね。見るまでもありませんでした。
参考までに、以下のコマンドで出力した、Connect-DPMServer で取得したオブジェクトの member を こちら に掲載しておきますので、AttachProductionServer 以外のメソッドやプロパティについても確認してみてください。DPMのコマンドレットは、Connect-DPMServer を起点にしていることがわかると思います。
Connect-DPMServer DJ-DPM01 | Get-Member | format-list
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : AddBackupNetworkAddressMemberType : MethodDefinition : System.Void AddBackupNetworkAddress(String address, UInt32 sequenc eNumber)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : add_ExternalDatasourceDetectedEventMemberType : MethodDefinition : System.Void add_ExternalDatasourceDetectedEvent(EventHandler`1 val ue)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : add_InactiveSourcesChangedEventMemberType : MethodDefinition : System.Void add_InactiveSourcesChangedEvent(EventHandler`1 value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : add_LibraryCollectionChangedMemberType : MethodDefinition : System.Void add_LibraryCollectionChanged(LibraryCollectionChangeEv entHandler value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : add_ProductionServerCollectionChangedEventMemberType : MethodDefinition : System.Void add_ProductionServerCollectionChangedEvent(EventHandle r`1 value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : add_ProtectionGroupCollectionChangedEventMemberType : MethodDefinition : System.Void add_ProtectionGroupCollectionChangedEvent(EventHandler `1 value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : AttachProductionServerMemberType : MethodDefinition : System.Void AttachProductionServer(String serverName, String userN ame, SecureString securePassword, String domain)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : CheckIfFileExistsInProdBinMemberType : MethodDefinition : System.Boolean CheckIfFileExistsInProdBin(String fileName, String& version, String& folderPath)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : ConvertToDpmTimeMemberType : MethodDefinition : System.DateTime ConvertToDpmTime(DateTime time)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : CreateProtectionGroupMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.P rotectionGroup CreateProtectionGroup(String protectionGroupName), Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.P rotectionGroup CreateProtectionGroup()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : DisksInStoragePoolMemberType : MethodDefinition : System.Int32 DisksInStoragePool()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : DisposeMemberType : MethodDefinition : System.Void Dispose()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : DumpMediaAsyncMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.JobManagem ent.Job DumpMediaAsync(Guid datasetId, Media media, String targetS erver, String targetPath, OverwriteType overwriteType, Boolean rec reateReparsepoint, Boolean restoreSecurity, JobStateChangedEventHa ndler jobEventHandler, String notificationMail)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : EqualsMemberType : MethodDefinition : System.Boolean Equals(Object obj)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetBackupNetworkAddressMemberType : MethodDefinition : System.Collections.Generic.List`1[[System.String, mscorlib, Versio n=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] GetB ackupNetworkAddress()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetCatalogRetentionValuesMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.XsdClasses.CatalogRetenti onValues GetCatalogRetentionValues()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetClustersMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.OMCommon.Cluster, ObjectModel, Ver sion=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] GetClusters()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetDatasourceCollectionMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.OMCommon.Datasource, ObjectModel, Version=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad364e3 5]] GetDatasourceCollection()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetDatasourcesWithInactiveProtectionMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.OMCommon.Datasource, ObjectModel, Version=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad364e3 5]] GetDatasourcesWithInactiveProtection()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetDatasourcesWithStartPathForSharesMemberType : MethodDefinition : System.Collections.Generic.List`1[[Microsoft.Internal.EnterpriseSt orage.Dls.UI.ObjectModel.OMCommon.Datasource, ObjectModel, Version =1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] Get DatasourcesWithStartPathForShares(String startPath)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetDatasourceWithStartPathOnProductionServerMemberType : MethodDefinition : System.Collections.Generic.List`1[[Microsoft.Internal.EnterpriseSt orage.Dls.UI.ObjectModel.OMCommon.Datasource, ObjectModel, Version =1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] Get DatasourceWithStartPathOnProductionServer(String startPath, String productionServerName)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetExternalDatasourcesMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.OMCommon.Datasource, ObjectModel, Version=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad364e3 5]] GetExternalDatasources()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetGlobalPropertyValueMemberType : MethodDefinition : System.String GetGlobalPropertyValue(String propertyName)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetHashCodeMemberType : MethodDefinition : System.Int32 GetHashCode()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetHouseKeepingJobStartTimeMemberType : MethodDefinition : System.DateTime GetHouseKeepingJobStartTime(HouseKeepingJobs job)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetLibraryCollectionMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.LibraryManagement.Library, ObjectM odel, Version=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856a d364e35]] GetLibraryCollection()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetProductInformationMemberType : MethodDefinition : DpmInformation GetProductInformation()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetProductionServersMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.OMCommon.ProductionServer, ObjectM odel, Version=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856a d364e35]] GetProductionServers()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetProductionServerWithIdMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.P roductionServer GetProductionServerWithId(Guid psId)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetProductionServerWithNameMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.P roductionServer GetProductionServerWithName(String productionServe rName)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetProtectionGroupsMemberType : MethodDefinition : System.Collections.Generic.IList`1[[Microsoft.Internal.EnterpriseS torage.Dls.UI.ObjectModel.OMCommon.ProtectionGroup, ObjectModel, V ersion=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 ]] GetProtectionGroups()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetProtectionGroupWithIdMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.P rotectionGroup GetProtectionGroupWithId(Guid pgId)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetStorageNodesMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ]] GetStorageNodes()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetTypeMemberType : MethodDefinition : System.Type GetType()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_AlertControllerMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.Alert.Aler tController get_AlertController()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_CurrentShadowCopyProvisionMemberType : MethodDefinition : System.Int32 get_CurrentShadowCopyProvision()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_DiskControllerMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.Library.DiskManagement .DiskController get_DiskController()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_DomainMemberType : MethodDefinition : System.String get_Domain()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_DPMDatabaseLogicalPathMemberType : MethodDefinition : System.String get_DPMDatabaseLogicalPath()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_GetEnterpriseAgentLicensesUsedMemberType : MethodDefinition : System.Int32 get_GetEnterpriseAgentLicensesUsed()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_GetStandardAgentLicensesUsedMemberType : MethodDefinition : System.Int32 get_GetStandardAgentLicensesUsed()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_IsLocalProtectionSetMemberType : MethodDefinition : System.Boolean get_IsLocalProtectionSet()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_LibraryJobQueryObjectMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.JobManagem ent.JobQuery get_LibraryJobQueryObject()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_NameMemberType : MethodDefinition : System.String get_Name()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_ProxyMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.Engine.CoreServicesProxy get_Proxy()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_ServerIdMemberType : MethodDefinition : System.Guid get_ServerId()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_SqlContextMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.DB.SqlContext get_SqlCont ext()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : get_VolumeListMemberType : MethodDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.OMCommon.DpmServerVolume, ObjectMo del, Version=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad 364e35]] get_VolumeList()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : IsRemoteYukonMemberType : MethodDefinition : System.Boolean IsRemoteYukon()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : IsServerProtectedMemberType : MethodDefinition : System.Boolean IsServerProtected(String server)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : JobQueryMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.JobManagem ent.JobQuery JobQuery(Boolean notRegisterForEvents)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : ReadDataSourceWithIdMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D atasource ReadDataSourceWithId(Guid dataSourceId)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : RecoverAsyncMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.JobManagem ent.Job RecoverAsync(IList`1 recoveryItemList, RecoveryOptions rec overyOptions, JobStateChangedEventHandler jobEventHandler, String notificationMail)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : RefreshLibraryStateMemberType : MethodDefinition : System.Void RefreshLibraryState()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : RemoveBackupNetworkAddressMemberType : MethodDefinition : System.Void RemoveBackupNetworkAddress(String address)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : remove_ExternalDatasourceDetectedEventMemberType : MethodDefinition : System.Void remove_ExternalDatasourceDetectedEvent(EventHandler`1 value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : remove_InactiveSourcesChangedEventMemberType : MethodDefinition : System.Void remove_InactiveSourcesChangedEvent(EventHandler`1 valu e)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : remove_LibraryCollectionChangedMemberType : MethodDefinition : System.Void remove_LibraryCollectionChanged(LibraryCollectionChang eEventHandler value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : remove_ProductionServerCollectionChangedEventMemberType : MethodDefinition : System.Void remove_ProductionServerCollectionChangedEvent(EventHan dler`1 value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : remove_ProtectionGroupCollectionChangedEventMemberType : MethodDefinition : System.Void remove_ProtectionGroupCollectionChangedEvent(EventHand ler`1 value)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : SetCatalogRetentionValuesMemberType : MethodDefinition : System.Void SetCatalogRetentionValues(CatalogRetentionValues catal ogRetentionValues)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : SetHouseKeepingJobStartTimeMemberType : MethodDefinition : System.Void SetHouseKeepingJobStartTime(HouseKeepingJobs job, Date Time startTime, Boolean onlyRemove)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : ToStringMemberType : MethodDefinition : System.String ToString()
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : TriggerRescanMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.JobManagem ent.Job TriggerRescan(RescanType rescanType, JobStateChangedEventH andler progressHandler)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : UpdateGlobalPropertyValueMemberType : MethodDefinition : System.Void UpdateGlobalPropertyValue(String propertyName, String propertyValue)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : VerifyDatasetMemberType : MethodDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.JobManagem ent.Job VerifyDataset(RecoverySourceLocation recoverySourceLocatio n, JobStateChangedEventHandler jobEventHandler)
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : AlertControllerMemberType : PropertyDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.Alert.Aler tController AlertController {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : CurrentShadowCopyProvisionMemberType : PropertyDefinition : System.Int32 CurrentShadowCopyProvision {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : DiskControllerMemberType : PropertyDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.Library.DiskManagement .DiskController DiskController {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : DomainMemberType : PropertyDefinition : System.String Domain {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : DPMDatabaseLogicalPathMemberType : PropertyDefinition : System.String DPMDatabaseLogicalPath {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetEnterpriseAgentLicensesUsedMemberType : PropertyDefinition : System.Int32 GetEnterpriseAgentLicensesUsed {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : GetStandardAgentLicensesUsedMemberType : PropertyDefinition : System.Int32 GetStandardAgentLicensesUsed {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : IsLocalProtectionSetMemberType : PropertyDefinition : System.Boolean IsLocalProtectionSet {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : LibraryJobQueryObjectMemberType : PropertyDefinition : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.JobManagem ent.JobQuery LibraryJobQueryObject {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : NameMemberType : PropertyDefinition : System.String Name {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : ProxyMemberType : PropertyDefinition : Microsoft.Internal.EnterpriseStorage.Dls.Engine.CoreServicesProxy Proxy {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : ServerIdMemberType : PropertyDefinition : System.Guid ServerId {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : SqlContextMemberType : PropertyDefinition : Microsoft.Internal.EnterpriseStorage.Dls.DB.SqlContext SqlContext {get;}
TypeName : Microsoft.Internal.EnterpriseStorage.Dls.UI.ObjectModel.OMCommon.D pmServerName : VolumeListMemberType : PropertyDefinition : System.Collections.Generic.ICollection`1[[Microsoft.Internal.Enter priseStorage.Dls.UI.ObjectModel.OMCommon.DpmServerVolume, ObjectMo del, Version=1.0.523.0, Culture=neutral, PublicKeyToken=31bf3856ad 364e35]] VolumeList {get;}
※今回ちょっと長いです。すんません。
DPMの環境設定を自動化しようシリーズの 2 回目です。
前回はセットアップ直後のDPMに、ボリュームを追加してストレージプールを作成しました。
【Management】DPM 2007 の初期設定を自動化 その1 ディスクを追加する
今回は、保護対象となるサーバーに対し、スクリプトを併用してエージェントをインストールしてみます。
ただ、エージェントのインストール自体は、できることならGUIから行ったほうがよいです。なぜならば、そのほうがはるかに簡単だからです。DPMサーバーと保護サーバーの間に Firewall があるためにRPCを使用したリモートからのプッシュインストールが行えないといった理由が無い限りは、管理コンソールから行ってください。
とはいえ、あえて手動で行ってみると、リモート管理に関する汎用的で細かなスキルを身につけることができますので、スキルアップを目的に挑戦してみるのならばよいかもです。
では、やってみましょう。
エージェントを手動でインストールするには2つのステップが必要です。
① DPM保護エージェントを保護サーバーにインストール ② DPMサーバーに、エージェントがインストールされた保護サーバーを認識させる(PowerShell)
それでははじめましょう。
① DPM保護エージェントを保護サーバーにインストール
保護エージェントのインストールの流れは以下の通りです。 保護サーバーの Windows Firewall サービスを停止する(無効にするのではなく、サービスを停止する) 保護サーバーにエージェントをインストール 保護エージェントの修正パッチがあれば、それを適用する Windows Firewall サービスを起動 保護エージェントに対して通信を許可するように Windows Firewall を設定する 上のリストにはとても重大な問題が含まれています。 それは、手順の一番上にある、保護サーバー上の Firewall サービスの停止という作業です。「無効」ではありません。「停止」です。「停止」しておかないと、以下のように、エージェントのインストール時に 80070643 エラーが発生して DPMAgentInstaller が失敗します。これは、どうやら各国語にローカライズさらたバージョンでのみ発生する問題のようです。 Installing agent and configure for dpmserver =[ServerName] DPMAgentInstaller failed with errorcode =8070643, error says: Check log files in [WINDIR]\Temp\MSDPM*.LOG Press Enter key to close the window が、慣れた方ならば何か違和感を感じますよね?そうです。Firewallサービスを無効にするならまだしも、停止してしまったらリモートからの通信を受け付けられないじゃんか!ということです。リモートコンピュータのサービスの停止は SC コマンドで簡単に行えます。が、Firewall サービスを停止してしまうと、二度とコマンドを受け付けることができなくなります。当然、Firewall サービスを起動することせえもできなくなりますから、これはもう、厄介どころの騒ぎではありません。現時点では、管理コンソールを使わず手動でインストールする場合には、リモートからのインストール制御は事実上不可能であると言ってもよいでしょう。 誠に残念ですが、ここでは保護サーバー上でバッチファイルを実行するという前提でお話を進めていきます。
保護エージェントのインストールの流れは以下の通りです。
上のリストにはとても重大な問題が含まれています。
それは、手順の一番上にある、保護サーバー上の Firewall サービスの停止という作業です。「無効」ではありません。「停止」です。「停止」しておかないと、以下のように、エージェントのインストール時に 80070643 エラーが発生して DPMAgentInstaller が失敗します。これは、どうやら各国語にローカライズさらたバージョンでのみ発生する問題のようです。
Installing agent and configure for dpmserver =[ServerName] DPMAgentInstaller failed with errorcode =8070643, error says: Check log files in [WINDIR]\Temp\MSDPM*.LOG Press Enter key to close the window
が、慣れた方ならば何か違和感を感じますよね?そうです。Firewallサービスを無効にするならまだしも、停止してしまったらリモートからの通信を受け付けられないじゃんか!ということです。リモートコンピュータのサービスの停止は SC コマンドで簡単に行えます。が、Firewall サービスを停止してしまうと、二度とコマンドを受け付けることができなくなります。当然、Firewall サービスを起動することせえもできなくなりますから、これはもう、厄介どころの騒ぎではありません。現時点では、管理コンソールを使わず手動でインストールする場合には、リモートからのインストール制御は事実上不可能であると言ってもよいでしょう。
誠に残念ですが、ここでは保護サーバー上でバッチファイルを実行するという前提でお話を進めていきます。
ーー 余談 ーー 実は、舞台裏を明かしますと、問題はこれだけではありませんでした。 以下のバッチファイルを見てください。ご覧頂くとお分かりの通り、 Firewallサービスの停止 → エージェントのインストール → Firewallサービスの起動 までを一気にやってしまおうとしています。こうしたバッチファイルを WinRS で保護サーバーに発行してしまえば、一度に処理を指示できることになるので、Windows Firewall サービスが停止してしまってもうまくいくかなと考えたのですが....どうしてもインストールの途中で処理が止まってしまい、うまくいきませんでした。原因追究にまるまる1日使ってしまいましたが、結局ダメでした。 net stop MpsSvc \\DJ-DPM01\i386\DPMAgentInstaller.exe /q DJ-DPM01.Example64.jp net start MpsSvc WinRM についてご存じない方は、以下の記事をご参照ください 【Windows Server 2008】WinRM Quickconfig って裏で何をやっている? WinRM が XP や 2003 でも使えるようになりました ( WS-Management 1.1 日本語版リリース ) せっかくなので、WinRM/WinRS 関連のTIPSをご紹介しておきます。 上記のようなバッチファイルをWinRSでリモートコンピュータに発行しようとすると、既定では以下のように「アクセスが拒否されました」エラーが発生します。 これは、発行先のコンピュータを経由してさらに別のコンピュータ(この場合には \\DJ-DPM01 )にアクセスしようとしているからです。おそらくお聞きになったことがあると思いますが、あるコンピュータを経由して別のコンピュータに接続する場合には、デリゲート(委任)機能を有効にしなければなりません。 委任を有効にするには、「Active Directory ユーザーとコンピュータ」で保護サーバーのプロパティを開き、[委任]タブで、「任意のサービスへの委任でこのコンピュータを信頼する」をチェックします。
ーー 余談 ーー
実は、舞台裏を明かしますと、問題はこれだけではありませんでした。
以下のバッチファイルを見てください。ご覧頂くとお分かりの通り、
Firewallサービスの停止 → エージェントのインストール → Firewallサービスの起動
までを一気にやってしまおうとしています。こうしたバッチファイルを WinRS で保護サーバーに発行してしまえば、一度に処理を指示できることになるので、Windows Firewall サービスが停止してしまってもうまくいくかなと考えたのですが....どうしてもインストールの途中で処理が止まってしまい、うまくいきませんでした。原因追究にまるまる1日使ってしまいましたが、結局ダメでした。
WinRM についてご存じない方は、以下の記事をご参照ください
せっかくなので、WinRM/WinRS 関連のTIPSをご紹介しておきます。
上記のようなバッチファイルをWinRSでリモートコンピュータに発行しようとすると、既定では以下のように「アクセスが拒否されました」エラーが発生します。
これは、発行先のコンピュータを経由してさらに別のコンピュータ(この場合には \\DJ-DPM01 )にアクセスしようとしているからです。おそらくお聞きになったことがあると思いますが、あるコンピュータを経由して別のコンピュータに接続する場合には、デリゲート(委任)機能を有効にしなければなりません。
委任を有効にするには、「Active Directory ユーザーとコンピュータ」で保護サーバーのプロパティを開き、[委任]タブで、「任意のサービスへの委任でこのコンピュータを信頼する」をチェックします。
エージェントをインストールするには、保護サーバー上で、DPMサーバの \Program Files\Microsot DPM\DPMAgents\RA\<i386 or amd64> 配下にある DPMAgentInstaller.exe を、DPMサーバー名を引数として実行します。つまり、以下のようなかんじです。 DPMAgentInstaller.exe /q DJ-DPM01.Example64.jp 保護サーバーのプラットフォームに合わせて、i386 か amd64 は選択してください。 この操作をリモートの保護サーバー上で実行させるわけですから、DPMサーバー上の i386 または adm64 フォルダを共有化しておくとよいでしょう。 i386 フォルダを、i386 という名前で共有化したとすれば、保護サーバーからは以下のようにして実行することができます。 \\<DPMServerName>\i386\DPMAgentInstaller.exe /q DJ-DPM01.Example64.jp エージェントのインストールが完了したら、Firewallサービスを起動しておきましょう。 次に 保護サーバー側の Windows Firewall の設定を行います。本来は SetDpmServer.exe というコマンドで行うのですが、やはりローカライズ版では不具合があるらしく手動でFirewallの例外の設定を行う必要があります。もちろん、DPM管理コンソールからインストールすれば自動的に例外を作成してくれます。 DPM管理コンソールを使用してリモートインストールを行うと、DPMRA.exe というプログラムに対して、以下のような例外ルールが作成されます。 上記と同じルールをコマンドから実施するには、おなじみ netsh を仕様します。 netsh advfirewall firewall add rule name="dpmra" dir=In action=Allow protocol=Any Program="%PROGRAMFILES%Microsoft Data Protection Manager\DPM\bin\DPMRA.exe" この後、再起動すれば保護サーバー側の作業は完了です。 以上の作業をバッチファイルで表現すると、以下の通りです。 net stop MpsSvc \\<DPMServerName>\i386\DPMAgentInstaller.exe /q DJ-DPM01.Example64.jp net start MpsSvc netsh advfirewall firewall add rule name="dpmra" dir=In action=Allow protocol=Any Program="%PROGRAMFILES%Microsoft Data Protection Manager\DPM\bin\DPMRA.exe"
エージェントをインストールするには、保護サーバー上で、DPMサーバの \Program Files\Microsot DPM\DPMAgents\RA\<i386 or amd64> 配下にある DPMAgentInstaller.exe を、DPMサーバー名を引数として実行します。つまり、以下のようなかんじです。
DPMAgentInstaller.exe /q DJ-DPM01.Example64.jp
保護サーバーのプラットフォームに合わせて、i386 か amd64 は選択してください。
この操作をリモートの保護サーバー上で実行させるわけですから、DPMサーバー上の i386 または adm64 フォルダを共有化しておくとよいでしょう。
i386 フォルダを、i386 という名前で共有化したとすれば、保護サーバーからは以下のようにして実行することができます。
\\<DPMServerName>\i386\DPMAgentInstaller.exe /q DJ-DPM01.Example64.jp
エージェントのインストールが完了したら、Firewallサービスを起動しておきましょう。
次に 保護サーバー側の Windows Firewall の設定を行います。本来は SetDpmServer.exe というコマンドで行うのですが、やはりローカライズ版では不具合があるらしく手動でFirewallの例外の設定を行う必要があります。もちろん、DPM管理コンソールからインストールすれば自動的に例外を作成してくれます。
DPM管理コンソールを使用してリモートインストールを行うと、DPMRA.exe というプログラムに対して、以下のような例外ルールが作成されます。
上記と同じルールをコマンドから実施するには、おなじみ netsh を仕様します。
netsh advfirewall firewall add rule name="dpmra" dir=In action=Allow protocol=Any Program="%PROGRAMFILES%Microsoft Data Protection Manager\DPM\bin\DPMRA.exe"
この後、再起動すれば保護サーバー側の作業は完了です。
以上の作業をバッチファイルで表現すると、以下の通りです。
② DPMサーバーに、エージェントがインストールされた保護サーバーを認識させる(PowerShell)
仕上げの作業として、DPMサーバーに保護サーバーを認識させます。これは専用の PS1 ファイルが提供されています。 DPM管理シェルを起動して、以下のパスに移動してください。 C:\Program Files\Microsoft DPM\DPM\bin ここで、Attach-ProductionServer.ps1 を以下の書式で実行します。引数を指定しなければ、プロンプトが表示されます。 Attach-ProductionServer.ps1 <DPM server name> <production server name> <user name> <password> <domain>. 実行結果例を以下に示します。 これで完了です。 以下のように、DPM管理コンソールにエージェントがリストされていれば成功です。 エージェントの更新欄に「利用可能な更新」が表示されている場合にはエージェントをアップグレードできますので、クリックして最新にしておきましょう。
仕上げの作業として、DPMサーバーに保護サーバーを認識させます。これは専用の PS1 ファイルが提供されています。
DPM管理シェルを起動して、以下のパスに移動してください。
C:\Program Files\Microsoft DPM\DPM\bin
ここで、Attach-ProductionServer.ps1 を以下の書式で実行します。引数を指定しなければ、プロンプトが表示されます。
Attach-ProductionServer.ps1 <DPM server name> <production server name> <user name> <password> <domain>.
実行結果例を以下に示します。
これで完了です。
以下のように、DPM管理コンソールにエージェントがリストされていれば成功です。
エージェントの更新欄に「利用可能な更新」が表示されている場合にはエージェントをアップグレードできますので、クリックして最新にしておきましょう。
いやー長かったですね。とても面倒です。
やはり、手動ではなく、管理コンソールを使用することをお勧めします。
次回は、保護グループの作成を行いましょう。
すこしDPMの話が続きましたが、ちょっと休憩して、新しいBLOGのご紹介です。
日本の Developer Support グループの中の Identity Management チーム が BLOGを開設しました。
管理者は見た!~AD と ILM 一家の秘密~ http://blogs.technet.com/jpilmblg/default.aspx
毎日、お客様からの難しい問い合わせを受け続けている専門部隊ですから、その内容は深いですよー。
製品の最新情報というよりは、運営に関するヒントを多く発信してくれると思いますし、サポートチームの内幕を知ることもできるでしょう。
是非ともみなさんご期待ください。
とりいそぎ、お知らせです。
Get-DPMDisk
Name MemberType Definition---- ---------- ----------Equals Method System.Boolean Equals(Object obj)GetHashCode Method System.Int32 GetHashCode()GetType Method System.Type GetType()get_CanAddToStoragePool Method System.Boolean get_CanAddToStoragePool()get_CanBeRemoved Method System.Boolean get_CanBeRemoved()get_DiskType Method System.Int32 get_DiskType()get_DPMServerName Method System.String get_DPMServerName()get_HasData Method System.Boolean get_HasData()get_Identifier Method System.Guid get_Identifier()get_IsInStoragePool Method System.Boolean get_IsInStoragePool()get_IsMissing Method System.Boolean get_IsMissing()get_Name Method System.String get_Name()get_NtDiskID Method System.Int32 get_NtDiskID()get_PgMember Method System.Collections.ArrayList get_PgMember()get_Status Method System.Int32 get_Status()get_TotalCapacity Method System.Int64 get_TotalCapacity()get_UnallocatedSpace Method System.Int64 get_UnallocatedSpace()get_VolumeCount Method System.Int32 get_VolumeCount()ToString Method System.String ToString()CanAddToStoragePool Property System.Boolean CanAddToStoragePool {get;}CanBeRemoved Property System.Boolean CanBeRemoved {get;}DiskType Property System.Int32 DiskType {get;}DPMServerName Property System.String DPMServerName {get;}HasData Property System.Boolean HasData {get;}Identifier Property System.Guid Identifier {get;}IsInStoragePool Property System.Boolean IsInStoragePool {get;}IsMissing Property System.Boolean IsMissing {get;}Name Property System.String Name {get;}NtDiskID Property System.Int32 NtDiskID {get;}PgMember Property System.Collections.ArrayList PgMember {get;}Status Property System.Int32 Status {get;}TotalCapacity Property System.Int64 TotalCapacity {get;}UnallocatedSpace Property System.Int64 UnallocatedSpace {get;}VolumeCount Property System.Int32 VolumeCount {get;}
Tech・Ed 中から予兆はあったのですが、終了と共に気を抜いたら咳がひどくなってしまい、月曜日はお休みをいただきました。即効性のある風邪薬!ということで、咳止めシロップを飲みました。
咳止めシロップなんて飲んだのは、もう25年ぶり位ですかね...。薬臭い中にも、独特の甘さがありますね。私が子供のころは、家庭の経済状況のこともあり(笑)、あまり「甘いもの」を食べさせてもらえなかった記憶があります。風邪をひくと、きまってこの種のシロップを飲まされたのですが、たまに口にする「甘み」がいとおしくて、大切に大切に飲んだ記憶があります...。そんなことを思い出したら、咳は止まりましたが、涙が止まらなくなりました。
さて、涙を拭きつつ、今回はData Protection Manager 2007 の初期設定を PowerShell から行ってみます。
ここでご紹介する内容は、DPMトラブル時の復旧に必要になりますので、是非とも覚えておいてください。
Data Protection Manager 2007 をインストールした直後にやらねばならない作業は3つあります。
今回は、「1. バックアップ領域となるディスクを認識させる」を行ってみます。
GUI では、初期状態は以下のようになっています。
ここにディスクを追加していくわけですが、事前にやっておくことがあります。それは、
以下をご覧ください。Windows Server 2008 サーバーマネージャの「記憶域」でサーバーに接続されているディスクの一覧を参照しているところです。
赤で囲ったディスクが、Data Protection Manager 2007 で利用可能なディスクですが、このままではディスク1はDPMが認識することができません。
なぜならば、「ディスク1」は「オフライン」だからです。
よって、DPMに認識させる前には必ずディスクをオンラインにしておかなければなりません。フォーマットの必要はありません。DPMが勝手に行ってくれます。
認識させたいディスクがすべてオンラインになったら、まずはDPM管理シェルからディスクの一覧を取得してみます。
サーバーに接続されている利用可能なディスク一覧を取得するには、Get-DPMDisk コマンドレットを使用します。DJ-DPM01 はDPMサーバーのホスト名です。
PS C:\> Get-DPMDisk DJ-DPM01 |format-table Name,NTDiskID
Name NtDiskID ---- -------- Msft Virtual Disk SCSI Disk Device 2 Msft Virtual Disk SCSI Disk Device 1
ここで、NTDiskID に注目してください。これは、上の記憶域画面の「ディスク1」「ディスク2」に対応しています。
それでは、ディスクをDPMに追加しましょう。ディスクを追加するには、Add-DPMDisk を使用し、引数に追加したいディスクのインスタンスを指定します。
以下の例では、NTDiskID = 1 のディスクを $DPMDisk として取得し、Add-DPMDisk に引数として指定しています。
PS C:\> $DPMDisk = Get-DPMDisk DJ-DPM01 | Where {$_.NTDiskID -eq 1} PS C:\> $DPMDisk
Name Status NtDiskId Total Capaci Unallocated Type ty Space ---- ------ -------- ------------ ------------ ---- Msft Virtu... 正常 1 127 GB 127 GB 基本
PS C:\>Add-DPMDisk -DPMDisk $DPMDisk PS C:\>
この例では、Where句を使用して追加したいディスクを特定しましたが、認識可能なディスクを片っ端から追加するのであれば、Where句を使わずに複数のインスタンスを $DPMDisk に取得しても問題ありません。Add-DPMDisk が複数のディスクを一気に追加してくれます。