PowerShellでメール送信

PowerShellではVer2.0から標準的なコマンドで
SMTPメールを送信することができます。

Send-MailMessage
※ 使用頻度の高いオプションのみ記載
-Attachments : 添付ファイルを指定
-Bcc : Bccのメールアドレスを指定
-Body : 本文内容
-Cc : Ccのメールアドレスを指定
-Encoding : 本文と件名に使用されるエンコード形式を指定
-From : 送信元メールアドレスを指定
-SmtpServer : メールを送信するSMTPサーバーを指定
-Subject : メッセージの件名を指定
-To : 宛先のメールアドレスを指定

使用例としては、以下のような形です。

Send-MailMessage -From admin@example.co.jp -To test@example.co.jp -Subject TestMessage -Body "Hello" -SmtpServer "smtpserver.example.co.jp";

日本語が含まれるメールを送信する場合は、Encodingオプションを指定しないと文字化けする可能性が高いです。
基本的にUTF8を指定すれば大概は大丈夫なイメージです。

Send-MailMessage -From admin@example.co.jp -To test@example.co.jp -Subject TestMessage -Body "ハロー" -SmtpServer "smtpserver.example.co.jp" -Encoding UTF8;

宛先やCcなどに複数のメールアドレスを指定する場合は、配列形式にして渡してあげれば大丈夫です。

$To = @("test@example.co.jp","test2@example.co.jp")
Send-MailMessage -From admin@example.co.jp -To $To -Subject TestMessage -Body "Hello" -SmtpServer "smtpserver.example.co.jp";

作業で時間を要するスクリプトを実行することも多いため、
スクリプトが終了したときに携帯電話へ完了メッセージを送るなどして活用しています。
送信に活用できるSMTPサーバーがある環境ならば、是非活用してください。

現在認証しているADサーバーを確認

AD関連の作業をしている際に、
特定のクライアントがどのADサーバーで認証されているかを
確認したい機会が多いです。

普段は「echo %logonserver%」コマンドで確認していたのですが、
最近のWindowsでは高速ログオン機能などの影響で前回ログオンしたADサーバーが
返されることもあるようです。

一応、以下のコマンドで確認ができそうです。

nltest /dsgetdc:ドメイン名

こんな出力が返ってきます。
1行目の「DC」欄が認証されているADサーバーですね。

DC: \\testadserver.example.local
アドレス: \\10.1.1.100
ドメイン GUID: d674291a-6b42-4b03-aac0-59d84fe9adba
ドメイン名: example.local
フォレスト名: example.local
DC サイト名: Main
本サイト名: Main
フラグ: PDC GC DS LDAP KDC TIMESERV WRITABLE DNS_DC DNS_DOMAIN DNS_FOREST CLOSE_SITE FULL_SECRET WS
コマンドは正常に完了しました

ちなみに以下のコマンドでADサーバー一覧をサイト情報と一緒に取得することが可能です。
こちらも便利です。

nltest /:dclist:ドメイン名

Exchangeでメールボックス内のメールを検索/削除する その1

Exchangeを運用するにあたりメール検索/監査、あるいは削除などを目的として
メールボックス内のアイテムを検索することを求められたりします。

色々条件などはつきますが、「Search-Mailbox」というコマンドを利用することで対応ができます。
https://technet.microsoft.com/ja-jp/library/dd298173(v=exchg.160).aspx

コマンド実行には、操作するアカウントに以下のRoleが必要です。
通常の管理者アカウントでは、コマンド自体が実行できません。
「Mailbox Search」
「Mailbox Import Export」

監査などの業務だと、所謂システム部門ではなく監査部門が対応する場合もありますので
権限の分割が可能です。(手順連携などは複雑でしょうけれども・・・・)

私のところに来た依頼としては、特定のメールボックスの予定表登録内容を削除したいというものでした。
コマンドのオプション「-SearchQuery」を使用して取得するアイテムを限定できるのですが、
クエリ設定の情報が少ないため検証に苦慮しました・・・・。
今回のように”予定表アイテムのみ”を指定したい場合は、下記クエリ設定で可能です。
-SearchQuery “Kind:meetings”

なお、オプション「-DeleteCcontent」を指定することで問答無用で削除可能です。

依頼内容を反映すると、以下のようなコマンドでしょうか。

Search-Mailbox -Identity "対象のメールアドレス" -SearchQuery "Kind:meetings" -DeleteContent

対象メールボックスの予定表アイテムにしぼり、問答無用で削除します。
上記コマンドだけではログに残りませんので、必要に応じてオプション調整が必要です。

Search-Mailbox -Identity "対象のメールアドレス" -SearchQuery "Kind:meetings" -TargetMailbox administrator -TargetFolder SearchResult -LogLevel Full -LogOnly

「-LogLevel」オプションをつけることで、クエリを投げた結果が「-Targetmailbox」で指定したメールボックスに保存されます。
「-LogOnly」オプションは、アイテムのコピーや削除を実行せず、あくまでクエリ結果のみを出力するオプションです。

ひとまずログを出力させてから実際の操作を行う方が丁寧かなと。

制限としては、クエリに対する結果が10,000件以上あると使用できないようです。
抵触した場合、大容量の検索実行は別コマンド「」が推奨される旨が表示されます。
別コマンドで実行しても良いのですが、残念ながらアイテム削除オプションは無いようです。

あくまで予定表フォルダ内の予定表アイテムを強制的に削除しているだけですので、
会議開催通知などで予定を共有している場合はメンバー全員への対応が必要です。
仮に会議主催者の予定を削除しても会議参加者の予定はそのままです。

公開NTPサーバー

サーバー、ネットワーク機器に限らず、構築時はNTPサーバーを指定する事が多いです。
自身がよく使用する公開NTPサーバーをまとめてみました。

■ NICT(独立行政法人 情報通信研究機構)
ntp.nict.jp(Stratum1)
個人的には、一番信用できるイメージ。よく設定しています。
https://www.nict.go.jp/

■ 国立天文台(水沢観測センター)
s2csntp.miz.nao.ac.jp(Stratum1)
こちらもStratum1であるため、よく設定しています。国内では貴重ですね。
http://www.miz.nao.ac.jp/

■ インターネットマルチフィード(MFEED)
ntp1.jst.mfeed.ad.jp (210.173.160.27)
ntp2.jst.mfeed.ad.jp (210.173.160.57)
ntp3.jst.mfeed.ad.jp (210.173.160.87)
http://www.mfeed.co.jp/

■ NTP POOL PROJECT
0.jp.pool.ntp.org
1.jp.pool.ntp.org
2.jp.pool.ntp.org
3.jp.pool.ntp.org
http://www.pool.ntp.org/ja/

■ Google
time.google.com
https://www.google.co.jp/

■ さくらインターネット
ntp1.sakura.ad.jp
https://www.sakura.ad.jp/

個人的には、(当たり前ですが)国内かつStratumの階層が高いNTPを優先的に設定しています。
大学が公開しているものも多いのですが、設備としてキャパシティが不明なため
設定実績はあまりありません。過去、知らぬ間に不通となっていたこともありました。
企業では契約したプロバイダーが提供している場合が多いので、ネットワークの経路と
冗長性を考えた設定をするべきかと思います。

PowerShellでファイル圧縮

PowerShellのVer5.0以降では、専用のコマンドとしてZip圧縮がサポートされています。
確認してみると、2つのコマンドが確認できます。

  • Compress-Archive(ファイル/フォルダ圧縮)
  • Expand-Archive(ファイル/フォルダ解凍)

<< Compress-Archive >>
ファイル/フォルダの圧縮を実行できます。

Compress-Archive -Path 圧縮元ファイル/フォルダ -DestinationPath 圧縮先指定(ファイル名も可)

試してみたところ、圧縮元が空フォルダである場合は圧縮ファイルは作成されないようです。
1つでも中身があれば正常に圧縮することができました。
ちなみに圧縮元ファイル/フォルダはワイルドカードが使用できる模様です。

Compress-Archive -Path C:\Test\* -DestinationPath C:\ArchiveTest.zip

「-CompressionLevel」オプションを使用することで、圧縮レベルを調整することができるようです。

  • Fastest:圧縮は高速だが、圧縮後のサイズは大きくなる。
  • NoCompression:圧縮はせず、ファイル/フォルダをまとめるだけ。
  • Optimal:(既定)ファイルサイズに応じて自動的に調整する。

圧縮対象が大量にある場合は変化があるかもしれませんが、通常はわざわざ変更する恩恵を受けられないかも・・・。

「-Update」オプションを使用することで、既存zipファイルにファイル/フォルダを追加できます。

Compress-Archive -Path C:\Test2 -Update -DestinationPath C:\ArchiveTest.zip

便利ですが機能上パスワードは設定できず、現在2GBまでのファイルしか圧縮できないようです。
ログローテーションなどに使用する分には十分な機能かと思います。

<< Expand-Archive >>
ファイル/フォルダの展開を実行できます。

Expand-Archive -Path C:\ArchiveTest.zip -DestinationPath C:\ExpandDirectory

こちらは単純に展開するだけですね。
残念ながら、こちらもパスワード付きzipには対応していません。
より高度な機能を使用するなら、専用のアーカイバーをインストールしてしまったほうが良いようです。

Outlook2013でExchangeキャッシュモードを強制

ExchangeとOutlookを使用している環境によっては、キャッシュモード
もしくはオンラインモードをユーザーに対して強制したい場合があります。

  • オンラインモード:
    直接Exchangeのメールボックスデータをクライアントのメモリに読み込んで表示される。
  • キャッシュモード:
    クライアントローカルのOSTファイルにデータがキャッシュされ、サーバーのメールボックス情報は逐次OSTファイルに対して同期される。ユーザーはOSTファイルのメールを表示・編集する。

設定を矯正する場合は、グループポリシーもしくはレジストリで実現可能です。

  • グループポリシーの場合
    ユーザーの構成 > ポリシー > 管理用テンプレート > Microsoft Outlook 2013
    > アカウントの設定 > Exchange > Exchangeキャッシュモード

    「新規および既存のOutlookプロファイルでExchangeキャッシュモードを使用する」
    有効 >> 適用されたクライアントにキャッシュモードを強制
    無効 >> 適用されたクライアントにオンラインモードを強制

  • レジストリの場合
    HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\15.0\Outlook\Cached Mode

    値の名前:Enable
    値の種類:REG_DWORD
    値のデータ:(1:キャッシュモードが強制、0:オンラインモードが強制)

グループポリシーの場合は、適用されるとアカウント設定の「Exchange キャッシュモードを使う」がグレーアウトされ、ユーザーではモードの変更ができませんので強制が可能です。
レジストリの場合は、適用されてもグレーアウトされません。初期設定は強制されますが、Outlook起動後はユーザーの手で変更することも可能です。

なお、ローカルに保存されたOSTファイルはモードを強制的に切り替えただけでは削除されません。使用しているOutlookプロファイルに紐付いて削除される形です。

NICの詳細設定をコマンドで変更する

仕事で大量のクライアントの設定変更をする話があったのですが、
いずれのクライアントも仕様でファイル共有が切られていたという事がありました。
幾つか制御の仕方はありますが、今回遭遇したのはNICの設定で制御されていたパターンです。
※ Microsoft ネットワーク用ファイルとプリンター共有のチェックボックスでした

台数も多かったのでなんとかコマンドでできないかと四苦八苦していたのですが、
どうにも標準的なコマンドなどは用意されていないようで。
設定を変更しながらレジストリも追ったのですが、かなり複雑です。
NICの管理IDがわからないと操作できないようなイメージです。

散々悩んだのですが、Technetに対応できるツールがありました!!
さすが、できる人は違う!!

Hyper-V Network VSP Bind (nvspbind)
https://gallery.technet.microsoft.com/Hyper-V-Network-VSP-Bind-cf937850

Hyper-Vやらキーワードが出ていますが、普通のクライアントでも実行できます。
32bitOSにも対応しているため、WinXPやWin7でも実行可能・・・うーん便利です。

実行もコマンドプロンプトからパラメーターを指定してexeを実行するだけと非常に簡単です。
【チェックボックスの有効化】
nvspbind.exe /e NIC名 機能名

【チェックボックスの無効化】
nvspbind.exe /d NIC名 機能名

今回有効化したかった「Microsoft ネットワーク用ファイルとプリンター共有」は
「機能名:ms_server」でした。各チェックボックスに対応した機能名入力が必要です。

注意点としては、NIC名を指定する際にマルチバイト文字に対応していない事。
日本語表記では駄目ですので、あらかじめNIC名を変更しておく必要があります。
【例】
nvspbind.exe /e LocalAreaConnection ms_server

NIC名変更とnvspbindをADスタートアップスクリプトで適用し、無事変更することができました。

PowerShellでCDトレイを開く

読んで字の如く、あくまでお遊び的なコマンドです。
作業用のスクリプトに取り込んでおくと、メディアの置き忘れ防止に良いかも。

(New-Object -com WMPlayer.OCX.7).cdromCollection.Item(0).Eject();

今のところ、試したPCではすべて動きました。

Windowsでダミーファイル作成

インフラの検証をしている際に、よく任意のサイズでダミーファイルが必要になります。
よくコマンドを忘れてしまうのでメモメモ・・・。

fsutil file createnew ファイル名 サイズ

コマンドプロンプトで実行可能です。
サイズ指定はバイト単位のため、1MBのファイルを作成する際はこうなります。

fsutil file createnew C:\test.txt 1048576

ちなみにコマンドはPowerShellでも実行可能です。
PowerShellだとMBやGBなどの単位を解釈してくれるので便利。
さきほどのコマンドもこうなります。

fsutil file createnew C:\test.txt (1MB)

こっちの方が直感的に使用できますね。
まとまった数を作りたい場合はこんな感じで。

# ダミーファイルを作成したい個数
$Count = 100;

for($i = 0;$i -lt $Count;$i++){
    fsutil file createnew "testfile$i" (1MB);
}