UACが有効な環境でスクリプトから「昇格」させる方法

UACが有効な環境では管理者権限が必要な操作をスクリプトから実行させようとすると失敗します。これを回避するためにはきちんと「昇格」させてあげなければいけません。 VBScriptで昇格させる方法はかなり前に以下の日記に書きました。 - [Windows VistaでのWSH(VBScript)の管理者権限への昇格方法 - ebi's diary - インフラエンジニアの子育てなどの日記(2008-08-13)](http://ebi.dyndns.biz/diary/20080813.html) 同様にPowerShellでも昇格させたい場合にはStart-Processの-Verbオプションに「RunAs」という引数を渡すことで実現可能です。ヘルプにも以下のように書かれています。 Starts a PowerShell process with “Run as Administrator” permissions. PS C:>start-process powershell.exe -verb runas VBScript, PowerShellそれぞれの私が良く使用するスニペットを貼り付けておきます。どちらも自分で書いたのではなく、どこかのコードを参考にさせてもらったものだったと思いますが、失念してしまいました・・・。 vbscript PowerShell

June 16, 2014 · 1 min · 胡田昌彦

Script Browser for Windows PowerShell ISEを試してみました

TechNetスクリプトセンターにある大量のスクリプト群をPowerShell ISE内から利用できる…というScript Browser for Windows PowerShell ISEを試してみました。 ダウンロードは以下から可能です。 - [Download Script Browser for Windows PowerShell ISE from Official Microsoft Download Center](http://www.microsoft.com/ja-JP/download/details.aspx?id=42525) インストール方法はウィザードを進めていくだけで非常に簡単なので省略。 インストール後にPowerShell ISEを起動すると、右側にScript Browserが表示されます。 ここから簡単に検索したり、ダウンロードしたりできるわけですね。 ダウンロードしてみると、きちんとそれなりjにいい感じの場所にスクリプトを配置してくれるようです。 場所は設定でも変更可能ですね。 ダウンロードしてみたスクリプトを開き、Script Analyzerタブでスクリプトをスキャンしてみました。 位置指定のパラメータを使ってると叱ってくれるようですね。他にも色々あるのだろうと思います。 別にブラウザで検索すればいいんじゃない?と言えばそうかもしれませんが、特に初心者向けには良さそうですね。

April 30, 2014 · 1 min · 胡田昌彦

オンプレミスからExchange Online(O365)へのメールボックス移行パフォーマンス分析スクリプトが便利です

ExchangeチームブログにてオンプレミスからExchange Onlineへのメールボックス移行パフォーマンスの分析スクリプトが紹介されています。そして非常に便利に使えそうです。 - [Mailbox Migration Performance Analysis - Exchange Team Blog - Site Home - TechNet Blogs](http://blogs.technet.com/b/exchange/archive/2014/03/24/mailbox-migration-performance-analysis.aspx) オンプレミス同士であってもメールボックス移行には様々なトラブルがつきものです。その中でも「パフォーマンスが出ない」というトラブルが非常に多く、頻繁に発生します。Exchange Online(O365)へのメールボックス移行となるとインターネット回線を経由することになるので時間も長くかかりますし、パフォーマンスは非常にクリティカルな問題になります。このようなツールも使いつつ、しっかりとメールボックス移行をしていく必要があります。 遅い!という時には結局再起動すると早くなった…なんていう事が一番多いんですけどね…(^^;

April 8, 2014 · 1 min · 胡田昌彦

タスクスケジューラーでPowerShellスクリプトを実行する方法

PowerShellスクリプトを書いておき、それをタスクスケジューラーで実行させたい場面があります。例えば深夜だれも使っていない時間帯に処理を行いたいけど、その時間にたちあいをするほどではない場合など。 直接PowerShellスクリプトを指定するのはあまりよくありません。関連付けの設定によりますがスクリプトがNotepadで開かれるだけだったりします。 このような場合にはpowershell.exeを実行し、引数としてスクリプトファイルのパスを指定するのが良いです。以下の様な感じです。 プログラムの場所は以下です。 - C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -cオプションでスクリプトのフルパスを記載します。さらに引数が必要な場合にはその後に続けることができます。

January 9, 2014 · 1 min · 胡田昌彦

電源プランの変更

Windows Server 2008以降では電源プランの規定値が「バランス」になっています。 このままで良いケースも多々あるとは思いますが、やはりパフォーマンスを要求されるサーバーでは「高パフォーマンス」に設定しておくのが良いと思います。それだけでも随分パフォーマンスに差が出るケースがあるそうです。 全台で設定して回るのも大変なので、せっかくなのでPowerShellで設定する方法も調べてみました。 [gist id=7480767] このようにしてPowerShellで設定可能です。

November 15, 2013 · 1 min · 胡田昌彦

SCOMエージェントを任意の場所から簡単にインストールするPowerShellスクリプト

SCOMエージェントのインストール作業をGUI操作で何度も実行するのが面倒になったので、さくっとPowerShellスクリプトを書きました。RemotePowerShellを使ってSCOMサーバーに入ってからInstall-SCOMAgentを叩く作りになってますので、ネットワーク上のどのPC上からでも実行できます。 [gist id=7426819]

November 12, 2013 · 1 min · 胡田昌彦

予定表の直接予約設定を見つけて無効化するスクリプト

Exchange Server Teamブログにて予定表の直接予約設定が行われているメールボックスを見つけて無効化するスクリプトが公開されています。 - Use Exchange Web Services and PowerShell to Discover and Remove Direct Booking Settings - Exchange Team Blog - Site Home - TechNet Blogs http://blogs.technet.com/b/exchange/archive/2013/05/09/use-exchange-web-services-and-powershell-to-discover-and-remove-direct-booking-settings.aspx これはとても素晴らしいスクリプトですね。有効に活用したいところです。 ところで、このブログの中で以下の部分が個人的に注目の箇所でした。 While the Direct Booking method for resource scheduling can indeed work on Exchange Server 2007/2010/2013, we strongly recommend that you disable Direct Booking for resource mailboxes and use the Resource Booking Attendant instead. 直接予約を使わないことを「強く推奨」しているとは知りませんでした。理由には納得ですしそうすべきと私も重います。ですが、実際の案件の中ではわざわざOutlookのレジストリを変更してまでして直接予約を有効にするケースがあります。なぜそんなことをするのかというとExchange Server 2003から使い続けているユーザーが2007, 2010に移行したタイミングで会議室予約時の挙動が変わってしまうのを良しとしない顧客がいるからです。 何かを「変更」するということを極端に嫌い、リスクを避け、変化を嫌い、何かあった時の責任を取りたくない…という気持ちはわからないでもないのですが、何に関しても「より良く改善していく」ということはやはり行うべきだし、ましてや製品を作っている側が「そうしてくれ」といっているようなことには従うべきだと思います。そうでなければ結局無駄なトラブルを招いたり、製品のメリットをきちんと最大限引き出すことができませんので。 というわけで、予定表の予約方法に関してはサーバーサイドで全部コントロールするようにすべきですね。 ...

June 5, 2013 · 1 min · 胡田昌彦

ディスク性能の計測方法

Jose Barreto’s Blogにてディスクの性能を測る方法について非常に参考になるブログ記事がありました。 - [SQLIO, PowerShell and storage performance: measuring IOPs, throughput and latency for both local disks and SMB file shares - Jose Barreto's Blog - Site Home - TechNet Blogs](http://blogs.technet.com/b/josebda/archive/2013/03/25/sqlio-powershell-and-storage-performance-measuring-iops-throughput-and-latency-for-both-local-disks-and-smb-file-shares.aspx) ディスク性能評価の際に非常に参考になると思います。

May 1, 2013 · 1 min · 胡田昌彦

SCCMのクライアントアクションをスクリプトで実行する方法

SCCM自体ほぼリアルタイムに反応するようなシステムではなく、設定が反映されるまでに長い時間がかかってしまいます。ですが、そういう環境でも「なるべく早く設定を反映したい、結果を得たい」という時にはクライアント側でアクションをキックする、ということができます。 クライアントアクションは以下のように多数存在しています。 クライアントコンピューター上で1台ずつすべて操作をするのも大変なので、スクリプトでキックできると素敵です。これはCPAPPLET.CPAppletMgrというCOMオブジェクトを使うことで可能です。以下、VBScriptとPowerShellのスクリプト例です。 [gist id=“4942879”] [gist id=“4942874”] 参考になれば幸いです。

February 16, 2013 · 1 min · 胡田昌彦

SCCMのクライアントアクションをスクリプトで実行する方法

SystemCenter関連の記事は以下のブログに移行しました。 - [System Center Blog](http://ebi.dyndns.biz/systemcenter/) この記事は以下の記事に移行しました。 - [SCCMのクライアントアクションをスクリプトで実行する方法 | System Center Blog](http://ebi.dyndns.biz/systemcenter/2013/02/16/sccm%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E5%AE%9F%E8%A1%8C/)

February 16, 2013 · 1 min · 胡田昌彦

PowerShellで名前解決周りの操作を行う

Scripting Guyにて、PowerShellでの名前解決周りの操作について解説されています。 Windows8, Windows Server 2012限定にはなりますが、この辺りは今までnslookupを使うとか、.NET Frameworkのクラスを直接使うなどしか手がなく苦しい感じだったのでかなり便利になりますね。 - [Replace NSLookup with a Built-in Windows 8 PowerShell Function - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs](http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/08/replace-nslookup-with-a-built-in-windows-8-powershell-function.aspx)

January 21, 2013 · 1 min · 胡田昌彦

SystemCenter Operations Manager(SCOM) 2012 SP1インストールの前提条件をクリアするPowerShellコマンドレット

SCOM 2012 SP1 Betaのインストール時に前提条件を整えるのがかなり面倒で、RTM化されたらどうにかしようと思っていました。本日RTM版でインストールを行うことができ、その際にコマンドレットで前提条件をインストールしたので共有したいと思います。 試したのは全部入りの構成です。 このように結構な数のコンポーネントを入れろと出てきます。 レポートビューアーコントロールのインストール - [http://www.microsoft.com/ja-jp/download/details.aspx?id=6442](http://www.microsoft.com/ja-jp/download/details.aspx?id=6442) からコンポーネントをダウンロードおよびインストールする。 Webコンソール PowerShellを管理者として実行し、以下のコマンドレットを実行します。 Install-WindowsFeature Web-Server Install-WindowsFeature Web-Metabase Install-WindowsFeature Web-Asp-Net Install-WindowsFeature Web-Windows-Auth Install-WindowsFeature Web-Request-Monitor Install-WindowsFeature Web-Mgmt-Console Install-WindowsFeature NET-WCF-HTTP-Activation45 前提条件がそろっても2つのチェックがクリアできないのはRTM版でも変わらずでした。こうなってしまったらインストーラーを一度キャンセルし、初めからやり直せばうまくいくのもBeta版と同じでした。 機能のインストールをPowerShellでガツンとできるだけでも結構時間の短縮になる印象です。このくらい自動的にやってくれてよさそうなもんですけど……ね? 参考になれば幸いです。

January 18, 2013 · 1 min · 胡田昌彦

SystemCenter Operations Manager(SCOM) 2012 SP1インストールの前提条件をクリアするPowerShellコマンドレット

SystemCenter関連の記事は以下のブログに移行しました。 - [System Center Blog](http://ebi.dyndns.biz/systemcenter/) この記事は以下の記事に移行しました。 - [SystemCenter Operations Manager(SCOM) 2012 SP1インストールの前提条件をクリアするPowerShellコマンドレット | System Center Blog](http://ebi.dyndns.biz/systemcenter/2013/01/18/systemcenter-operations-managerscom-2012-sp1%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6%E3%82%92%E3%82%AF%E3%83%AA%E3%82%A2%E3%81%99%E3%82%8Bp/)

January 18, 2013 · 1 min · 胡田昌彦

Windows8でRemotePowerShellを有効にする方法

Windows Server 2012ではRemotePowerShellが規定で有効になっていますが、Windows8ではそうではありません。有効化する方法が紹介されています。 Understanding PowerShell Remote Management - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs

January 12, 2013 · 1 min · 胡田昌彦

デジカメ、スマートフォンなどで撮影した画像、動画ファイルをリネーム後月ごとのフォルダに移動するスクリプト

若干Windows Serverからは離れますが、自宅用にPowerShellスクリプトを書いたので紹介してみます。デジカメ、スマートフォンなどで撮影した画像、動画ファイルをリネーム後月ごとのフォルダに移動するスクリプトを書きました。ソースコードはgistにアップしたので参考になる部分があれば…。 [gist id=4175880] 以下、ちょっと苦労した点等です。 Exif情報の取得 Exif情報から撮影日時を取得しています。Exif情報の取得には.NET FrameworkのSystem.Drawing.Bitmapクラスを使っています。以下の部分です。 [Reflection.Assembly]::LoadWithPartialName(“System.Drawing”) | Out-Null $img = $null $img = New-Object Drawing.Bitmap($file_path) $date = ($img.PropertyItems | Where-Object{$_.Id -eq 306}).value $date = [Text.Encoding]::ASCII.GetString($date).Replace(":",".").Replace(" “, “-”) $date = $date.Substring(0, $date.Length -1) $img.Dispose() $img = $null [Reflection.Assembly]::LoadWithPartialName(“System.Drawing”) の部分はOut-Nullにパイプしておいてあげないと関数の戻り値として戻ってきてしまいました。PowerShellってそういうものなのですね。今まで知りませんでした・・・。 BitmapクラスのPropertyItemsプロパティでIdが306のものが撮影日時みたいです。Exifの企画やBitmapクラスの仕様はよくわかっていませんが、これで問題なかったのでよしとしてます・・・。 バイナリで入っているのでText.Encoding.ASCIIのGetString関数で文字列にしています。この時に文字列の最後にヌル文字(\0)が入っているのですが、これがどうやっても取れず、しかたがないので$date = $date.Substring(0, $date.Length -1)としてしまいました。妥協です。「`0」が該当するのかと思ったのですが、違うみたいです・・・。 $img.Dispose()しておいてあげないと、連続してリネームしたり移動する時に「他のプロセスが使用しています。」と怒られてしまったので処理を入れています。 その他は考えてみたらあまり苦労していないのですが、本筋とは違うテストの部分でPesterが端末毎に挙動がちがったり、最新版を使おうとするとそもそもPesterがうまく動かなかったり、しかたがないのでPSUnitを使ってみたらテストに失敗しても実際のオブジェクトの内容を表示してくれなかったりなど、テスト周りで苦労してしまいました。結局ちゃんとテストが書けていません。PowerShellのテストはPesterでOKだと思っていたのですが、もうちょっと研究が必要なようです…。

November 30, 2012 · 1 min · 胡田昌彦

Office365へのPowerShell接続時にはWinHttpを使用しています。

かなり久しぶりに自宅に仕事を持ち帰ってしまいました。Office365のExchange Online周りのトラブル対応のスクリプトを書いたり動作確認したりするためにRemote PowerShellで接続しようとした所エラーが…。 New-PSSession : [ps.outlook.com] リモート サーバー ps.outlook.com への接続に失敗し、次のエラー メッセージが返されました WinRM は処理を完了できません。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスで きること、および WinRM サービスのファイアウォールの例外が有効になっていてこのコンピューターからアクセスできることを確認 してください。 既定では、パブリック プロファイルの WinRM ファイウォールの例外によって、同一のローカル サブネット内のリ モート コンピューターへのアクセスは制限されます。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照し てください。 発生場所 行:1 文字:16 $O365Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUr … CategoryInfo : OpenError: (System.Manageme….RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin gTransportException FullyQualifiedErrorId : WinRMOperationTimeout,PSSessionOpenFailed ネットワーク的にはきちんとInternetに接続できてますし、IEでもきちんと外部サイトが見られる状態。Proxyは無し。Windowsファイアウォールも無効の状態でした。なぜなのかわからずTwitterでつぶやいていたら@genkiwさんにポイントを教えてもらえました。ありがとうございました! @ebi 接続先はポータルでしょうか、Exchange Onlineでしょうか? Proxyの設定(IEとwinhttp)とかサインインモジュールが古いとか、 Set-ExecutionPolicy RemoteSignedが実施されてないとか。 — 渡辺 元気さん (@genkiw) 11月 7, 2012 結局、WinHttpの設定がproxyを使用する設定のままになっており、proxyが無い環境なのでps.outlook.comに到達できない状態でした。 Vista以降ではコマンドプロンプトにて「netsh winhttp show proxy」にて現在の設定の表示、「netsh winhttp import proxy ie」にてIEからの設定の取り込みが可能です。これできちんと接続できるようになりました。接続方法はこちら。 ...

November 8, 2012 · 1 min · 胡田昌彦

PowerShellで再起動を含めた処理の自動化

PowerShellを使ってWindowsの自動再起動を含めた処理の自動化をする方法…の一例を紹介します。最近だとPowerShell3.0でリモートPowerShellを使うとコマンド1発だったりするのですが、PowerShell2.0以前だったり自ホストに対しての処理を行うような場合にはまだ需要はあるものと思います。 自動ログオンさせる 自動ログオンさせるのは以下のようにできます。 [gist id=3987219] 単純にレジストリにユーザー名、パスワードを書いてしまえばOKです。 参考 - [AutoAdminLogon](http://technet.microsoft.com/en-us/library/cc939702.aspx) - [DefaultUserName](http://technet.microsoft.com/en-us/library/cc939710.aspx) - [DefaultDomainName](http://technet.microsoft.com/en-us/library/cc939708.aspx) - ※DefaultPasswordに関してはMSの技術文章が見つからないですね…。 再起動後にPowerShellスクリプトを実行する 再起動後(のログオン後)にPowerShellスクリプトを自動的に実行させるのは以下のようにできます。 [gist id=3987231] RunOnceレジストリキーに書き込んでおくという方法です。 参考 - [レジストリの RunOnce キーの定義](http://support.microsoft.com/kb/137367/ja) これらの方法を組み合わせれば、再起動~自動ログオン~PowerShellスクリプト実行を全自動で行うことができます。

October 31, 2012 · 1 min · 胡田昌彦

PowerShellを使ってExcelできちんと開けるCSVファイルを作成する方法

PowerShellからCSVファイルを作成し、それをExcelで開いて…という操作は結構需要があり、頻繁に行われるのではないかと思います。ちょっとしたはまりポイントがありますので、そのあたりのTipsを紹介しようと思います。 Export-Csv PowerShellの素敵な点の1つはオブジェクトを簡単にCSVに出力できるコマンドレットが標準で用意されているところだと思います。 ただし、日本語が含まれている場合に、そのまま何も考えずにExport-Csvを実行すると文字化けが発生してしまいます。 これは、Excelで読み込むときにエンコーディングの判定に失敗して文字化けしている…という事ではなく、PowerShellでファイルを吐き出した時に????に変換されてしまっています。なので、出力時にきちんとエンコーディングを指定してあげる必要があります。 どのエンコーディングを使うか、というのは人によって意見が違うかもしれませんが、私はいつもUTF-8を使います。これであればきちんと日本語も出力され、Excelで開いた時にも文字化けもなく意図した通りに開きます。 ExcelでShift-JIS以外の文字コードでは文字化けが発生する問題 実は先ほどの例ではうまくいっていますが、ExcelはCSVファイルはShift-JISにしておかないと文字化けすることが多い困ったやつです。回避策はいくつかあります。以下のあたりが参考になります。 ExcelでUTF-8のCSVを開く方法 (CodeZine編集部ブログ) ExcelでUTF-8エンコーディングされたCSVファイルを開く方法 - 大人になったら肺呼吸 先ほどの例ではBOM付きのUTF-8であったためうまく表示されたわけです。Stirlingでファイルを確認するとファイルの先頭に「EFBBBF」が不可されていることがわかります。 スクリプト内でファイルに出力する場合 Export-Csvを使う場合には-Encodingオプションを付ければよいことはわかりましたが、foreachの中などで、自分で文字列をファイルに出力したいようなときには残念ながら別の問題が発生します。 このようにA列にすべて表示されてしまいます。(※文字化けをしていないのはExcel2010だからなのではないかと思います。) これも回避策としてはいくつかあると思いますがShift-JISで出力するにはAdd-Contentコマンドレットで-EncodingにStringを指定することができます。 UTF-8でBOM付きにしようと思ったら、先にファイルを作成しておくと良いようです。

October 2, 2012 · 1 min · 胡田昌彦

PowerShellでxmlファイルを読む方法

PowerShellでは非常に簡単にXMLファイルを読み込んで利用することができます。 XMLファイルのサンプルにはググると一番上に出てくる以下のものを使わせてもらいます。XML文書のサンプル - XMLの基本 - XML入門で紹介されているものです。 - www.webword.jp/xml/ini/sample1.xml [http://www.webword.jp/xml/ini/sample1.xml](http://www.webword.jp/xml/ini/sample1.xml) ソ h 楽 h フ t 天 t ト t 株 t バ p 式 p ン : 会 : ク / 社 / 株 / / 式 w w 会 w w 社 w w . . s r o a f k t u b t a e n n k . . c c o o . . j j p p / / i n f o / P o w e r S h e l l で x m l フ ァ イ ル を 読 み 込 む の は 以 下 の よ う に で き ま す 。 G e t - C o n t e n t で 読 み 込 み 、 [ x m l ] を 付 け る こ と で X m l D o c u m e n t に し ま す 。 - [xml]$venture = Get-Content -path C:\tmp\sample1.xml 結果、xmlのオブジェクトが出来上がります。 ...

September 18, 2012 · 1 min · 胡田昌彦

2012-08-16

仕事でPowerShellスクリプトを書く事がかなり多くなってきた事もあり、テストちゃんと書きたいなーと思ってPesterを知る。 scottmuc/Pester ちょっと違和感あるけど、悪くない感じ。

August 16, 2012 · 1 min · 胡田昌彦

AI・テクノロジーの情報を発信しています

YouTube

AI・テクノロジーの最新トレンドを動画で配信中

note

技術コラム・深掘り記事を公開中