2010/03/28

PowerShellでTwitter投稿

こんな記事を見た。

twitter で大学のネットワークを監視 [これでも大学職員のブログ -情報センター勤務中-]
http://d.hatena.ne.jp/daigaku-syokuin/20100326/p1

と、いうわけで探してみました。
やはりPowerShell経由でTwitter投稿するスクリプトを作っている方がいました。

SAPIEN Technologies
http://blog.sapien.com/index.php/2008/06/23/out-twitter/

Mike Ormond's Blog
http://blogs.msdn.com/mikeormond/archive/2009/01/30/updated-twitter-powershell-script.aspx

素晴らしい。で、二つのスクリプトの良いとこ取りをしてくっつけてみた。
以下をFixtwit.ps1 として保存してください。
Function Out-Twitter {

    BEGIN {
            #check for global Twitter credential
            if (!$global:Twitter_Credential) {
                $global:Twitter_Credential=Get-Credential
            }
    }

    PROCESS {
  
        #turn off error pipeline
        $erroractionpreference="SilentlyContinue"
  
        [string]$tweet=$_
  
        ##Twitter投稿関数
        function SubmitWebRequest(  
            [string] $RequestUrl,
            [string] $RequestMethod,
            [string] $RequestContentType,
            [string] $PostString,
            [string] $Username,
            [string] $Password
            )
        {
          [System.Net.ServicePointManager]::Expect100Continue = $false

          $request = [System.Net.WebRequest]::Create($RequestUrl)
          
          if ($Username) {
            $request.Credentials = new-object System.Net.NetworkCredential($Username, $Password)
          }
          
          $request.Method = $RequestMethod
        
          if ($RequestMethod -ieq "POST") {
            $request.ContentType = $RequestContentType      

            $formdata = [System.Text.Encoding]::UTF8.GetBytes($PostString)
            $request.ContentLength = $formdata.Length
            $requestStream = $request.GetRequestStream()
            $requestStream.Write($formdata, 0, $formdata.Length)
            $requestStream.Close()
          }
        
          $response = $request.GetResponse()

          $reader = new-object System.IO.StreamReader($response.GetResponseStream())
          $returnvalue = $reader.ReadToEnd()
          $reader.Close()
        
          return $returnvalue
        } #end function
      
        #Short Url
        Function Get-Snurl {
            Param([string]$link="http://www.google.com")
      
            $tinyurlrequest = "http://tinyurl.com/api-create.php?url=$link"
                       

            write-progress "Tweeting" "Getting tiny URL" -cu $tinyurlrequest
            $tinyurl = SubmitWebRequest $tinyurlrequest "GET"
            write-debug "Tweeting - Received tiny URL Response: $($tinyurl)"
            write $tinyurl
  
        }
        #search for web links using Regex
        [regex]$regex="(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?"
  
         If ($tweet -match $regex) {
                  $link=$matches[0]
          }
       
         #if an embedded url was found, convert it to a snurl link
         if ($link) {
            $snurl=Get-Snurl $link
            $tweet=$tweet.Replace($link,$snurl)
         }


        if ($tweet.Length -gt 140) {
            Write-Warning ("Your message is " + (($tweet.length)-140)  + " characters too long.")
            $clear=$True
            return
        }
      
      
        $tweetstring = [String]::Format("status={0}", $tweet)
        $request = [Net.WebRequest]::Create($url)
        $twitusername=$global:Twitter_Credential.GetNetworkCredential().Username
        $twitpassword=$global:Twitter_Credential.GetNetworkCredential().Password
      
        $twitResponseText = SubmitWebRequest `
                                    "http://twitter.com/statuses/update.xml" `
                                    "POST" `
                                    "application/x-www-form-urlencoded" `
                                    $tweetstring `
                                    $twitusername `
                                    $twitpassword
        write-debug "Tweeting - Posted status update. Response: $($twitResponseText)"

   }
    
    END {
        #if there was an error, then don't keep the global Twitter
        #credential
        if ($clear) {
            Remove-Variable Twitter_Credential -scope Global
            }
        }
      
} #end Function
 じゃば、使ってみる。
PS 2010/03/28 12:23> . .\fixtwit.ps1
PS 2010/03/28 12:24> "もう昼・・お腹すいた・・" | Out-Twitter
fixtwit.ps1 をドット化して実行。
つぶやきたい言葉をはいて、パイプを通し Out-Twitter を実行。

実行すると資格情報を聞かれるので、
Twitterのアカウントとパスワードを入力する。


入力すると処理が走り、投稿完了。

投稿されていることが確認できた。
URL短縮もされるはずなんだけど、うまく行く時と行かないときがあるような。。
なんでだろう。
↑修正しました。

あくまでツギハギなので本家のスクリプトを見に行ってください。
これをPowerShellのバックグラウンド処理を使えば監視っぽいことはできるかもですね。

2010/03/25

チェックブログふえてきました。

ブログチェックにはRSSがとても便利。
MS社員の方も多くのブログを運営していて、とても参考になります。
技術共有が簡単にでき、いろんな可能性を秘めているこの業界がやっぱり好きです。

Windows Maniax の野良さんによってマイクロソフト株式会社の社員ブログ一覧が
まとめられています。

開発系のブログも紹介されているのでチェックしてはいかがでしょうかー。

2010/03/24

PowerShellの使い方


PowerShellがいくら普及してきた、といってもいきなり
1から10までPowerShellでやるには荷が重いし、
運用管理レベルでは、仰々しく作り込みをするではなく
はじめの内はバッチの中でちょこちょことコマンドレッドを使うというレベルでいいかと思う。
慣れてきたら色々趣向をこらしてやってみるってことで。
(いまだ.NETFrameWork よくわからないし。)

例えば、ここ最近のHotFix適用状況を調べるバッチだとこんな感じで。
 @echo off
:1
echo HotFixチェック
set /p kbmonth=何ヶ月分のFotFixを出力しますか?:

powershell -command "& { Get-HotFix | ? { $_.InstalledOn -ge $(get-date).addmonths(-%kbmonth%) } }"

pause
goto 1
 これをバッチとして用意して実行すれば、
コマンドプロンプトの中でPowerShellを呼び出し、Get-HotFixコマンドレッドを使って
HotFixの適用状況を得ることができます。
HotFixチェック
何ヶ月分のFotFixを出力しますか?:1


Source        Description      HotFixID      InstalledBy          InstalledOn
------        -----------      --------      -----------          -----------
BUSO-PC       Update           KB976264      NT AUTHORITY\SYSTEM  2010/03/10...
BUSO-PC       Update           KB980302      NT AUTHORITY\SYSTEM  2010/03/23...



続行するには何かキーを押してください . . .
HotFixチェック
何ヶ月分のFotFixを出力しますか?:2

Source        Description      HotFixID      InstalledBy          InstalledOn
------        -----------      --------      -----------          -----------
BUSO-PC       Security Update  KB971468      NT AUTHORITY\SYSTEM  2010/02/10...
BUSO-PC       Security Update  KB975560      NT AUTHORITY\SYSTEM  2010/02/10...
BUSO-PC       Update           KB976264      NT AUTHORITY\SYSTEM  2010/03/10...
BUSO-PC       Update           KB976662      NT AUTHORITY\SYSTEM  2010/02/24...
BUSO-PC       Update           KB976972      NT AUTHORITY\SYSTEM  2010/01/27...

:(略

まぁはじめはこんな感じで徐々にコマンドレッドを使っていく、という形で。
しかし、この使い方でもPowerShellのリモート機能を組み合わせると結構面白いことができます。
それはまぁ、機会あればまたいずれ。

2010/03/22

Select-String その他。

Select-Stringコマンドレッドは、
-Pattern にそって文字列やファイルからテキストを抜き出すことができる。
正規表現も利用できるので、今回は "=[02468]"
つまり、イコールのあとに偶数・奇数がくるものをパターンとしてオブジェクトを作り出した。
とりあえず、小難しいことは置いといて、Select-Stringはgrepやfindstrの代わりになり、
正規表現も使用可能だということを覚えとく。

PowerShellを扱う場合、その出力されたオブジェクトはなにかを把握しておくことも重要。
オブジェクトがなんなのかを調べるには、Get-Member(エイリアスはgm)を使うといい。

PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | gm


   TypeName: Microsoft.PowerShell.Commands.MatchInfo

Name         MemberType Definition
----         ---------- ----------
Equals       Method     bool Equals(System.Object obj)
GetHashCode  Method     int GetHashCode()
GetType      Method     type GetType()
RelativePath Method     string RelativePath(string directory)
ToString     Method     string ToString(), string ToString(string directory)
Context      Property   Microsoft.PowerShell.Commands.MatchInfoContext Conte...
Filename     Property   System.String Filename {get;}
IgnoreCase   Property   System.Boolean IgnoreCase {get;set;}
Line         Property   System.String Line {get;set;}
LineNumber   Property   System.Int32 LineNumber {get;set;}
Matches      Property   System.Text.RegularExpressions.Match[] Matches {get;...
Path         Property   System.String Path {get;set;}
Pattern      Property   System.String Pattern {get;set;}
今回はSelect-Stringコマンドレッドを使ったことで
Microsoft.PowerShell.Commands.MatchInfo オブジェクトができたわけだ。
要素を指定してオブジェクトプロパティを見てみよう。

PS .\sample> $(Select-String -Pattern "=[02468]" .\userlist.txt)[0].line
CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local

PS .\sample> $(Select-String -Pattern "=[02468]" .\userlist.txt)[0].linenumber
2
Foreach-Object コマンドはエイリアスで Foreach または % として割り当てられている。
ちなみに、パイプで渡された各オブジェクトは $_  としてわたされる。
同じくプロパティを見てみる。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_.line }
CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=4,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=6,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=8,ou=Tokyo,dc=ad-domain,dc=company,dc=local

PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_.linenumber }
2
4
6
8
 2行目の整形前を出力する。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_ }

userlist.txt:2:CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local
userlist.txt:4:CN=4,ou=Tokyo,dc=ad-domain,dc=company,dc=local
userlist.txt:6:CN=6,ou=Tokyo,dc=ad-domain,dc=company,dc=local
userlist.txt:8:CN=8,ou=Tokyo,dc=ad-domain,dc=company,dc=local
 文字列オブジェクトには -split で区切ることができるので分解。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_ -split "," }
E:\sample\userlist.txt:2:CN=2
ou=Tokyo
dc=ad-domain
: (略
 分解した文字列は配列に格納されているため、1番目のものだけ取り出す。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $($_ -split",")[0] }
E:\sample\userlist.txt:2:CN=2
E:\sample\userlist.txt:4:CN=4
E:\sample\userlist.txt:6:CN=6
E:\sample\userlist.txt:8:CN=8
 同様の手順で"="で区切り、2番目の要素を取り出し、目的のアカウントの部分を取得する・・と。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $($_ -split",")[0] } | % { $($_ -split "=")[1] }
2
4
6
8
 ----------------------------------------------------------
・・・すいません、詳しく説明しようとしたら、逆にわかりにくくなったですね
ここらへんに絵での説明に限界を感じる(笑)
とりあえずForeach-Objectの使い方とGet-Memberを覚えておこうってことで。

2010/03/21

データ整形


この時期は、新年度を控えていてデータ整理だとかをしなきゃいけなかったりする。
Dsquery user コマンドを使うことで、ADのユーザーオブジェクトを取得することができる。
サンプルとして下記ユーザーデータ userlist.txtを取得できたとする。

CN=1,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=3,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=4,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=5,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=6,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=7,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=8,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=9,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=10,ou=Tokyo,dc=ad-domain,dc=company,dc=local

このアカウント(CN)の1文字目の数字から偶数・奇数 へと分ける。
さらにアカウント以外の余分なパスを削って、という指示。
PowerShellが出たことで、
Windows管理者といえどスクリプトをある程度は使いこなさないといけない時代がきてますよね。
僕はスクリプト書くのは好きなほうなんですが
いかんせん普段から使っているわけでないので発想に乏しいというかなんというか・・。

ちなみに、新人の子がとった手法はこちら。

grep =0 userlist.txt | cut -d , -f 1 | cut -d = -f 2 | cat >> Even
grep =1 userlist.txt | cut -d , -f 1 | cut -d = -f 2 | cat >> Odd
grep =2 userlist.txt | cut -d , -f 1 | cut -d = -f 2 | cat >> Even
grep =3 userlist.txt | cut -d , -f 1 | cut -d = -f 2 | cat >> Odd
 grepの検索を10回分 手動でかえてあげる必要はあるものの、あとはうまく切り取ってる。
早く結果を出力するのがなんぼなので力技でやったにせよ、よく考えたなぁと。
そして僕はというと・・。
PS .\sample> $regex1 = "^.*=([13579].*)(,OU=Tokyo)"
PS .\sample> gc .\userlist.txt | Select-String -Pattern $regex1 -AllMatches `
>> | foreach { $_.matches[0].groups[1].value }
>>
1
3
5
7
9
10
正規表現での抽出にばかり目が行って、出力されるはされたけれどわかりづらい・・。
新人の子と僕のを組み合わせた方式がてっとりばやくてわかりよいか。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | `
>> foreach { $($_ -split ",")[0] } | foreach { $($_ -split "=")[1] } | sort
>>
2
4
6
8
積極的に実務にPowerShell使っていきたいー。

2010/03/15

ループバック処理


最後は、駆け足ですが。
動作としては、マシン起動したあとにコンピュータにつけられたコンピュター構成のGPOが適用され
その後、ユーザーログインした時に、ユーザーにかけられたGPOが適用、
最後にループバック処理を実施している場合はコンピュータにかけられたユーザー構成GPOが適用されます。

設定手順は下記の通り。
ユーザー構成をコンピュータごとに設定するには、次の手順を実行します。
  1. グループ ポリシー Microsoft 管理コンソール (MMC) で [コンピュータの構成] を展開します。
  2. [管理用テンプレート]、[システム] を順に展開し、[グループ ポリシー] をクリックし、[ユーザー グループ ポリシー ループバックの処理モード] を有効にします。
 3回に分けて描きましたが、いずれにせよ、どうGPOを管理するかがポイントだと思います。
グループポリシーオブジェクトの置き場所はツリー構造じゃないので、
数が増えていくにつれて管理が困難になっていくので困る。
他にも何かGPOの管理手順で良い方法とかあれば教えて頂ければ嬉しいです。

2010/03/11

サイト構成とGPO


とはいえ、部署内において通常は一元化されたポリシー適用する、
というのが普通だったのでこの方式でだいたいまかなうことができていた。
どうしてもというのであれば、
次回取り上げるであろうGPOのセキュリティ設定によって変化をつけたりする方法もある。
あとはプロファイルによる設定変更で対処はしていた。

しかし、2008Serverになり、ポリシーのみならず基本設定による管理も進んで行くと思うので
やっぱりGPOのループバック処理 が必要となってきそうです。

2010/03/10

グループポリシー ループバック処理

中途半端なところで切れてますが、また続きは明日以降に。
結局、コンピューターOUに対してユーザー構成GPOも適用できるというだけの話なのですがw
でも、これ知ってると知らないじゃあえらい違いだよね。。自分の不学に嘆く。

先に技術内容知りたい方はこちらどぞ。
 グループポリシーのループバック処理 MSサポートオンライン
http://support.microsoft.com/kb/231287/ja

2010/03/08

模索ちう


--(3/10追記)元画像、上書きしちゃって消えちゃいました・・orz--

ミート村では、ポーク君がチキンちゃんへ恋文を送りたいと思っていました。
しかし、恋敵のダック君に中身を知られたくはありません。
ポーク君はAD CSに暗号化とPKIの手法を尋ねるのでしたーーー



うーん、なんてことを1から描いてたら、遅々として話が進みそうにない(笑)
MSの「PKI&認証セキュリティ大全」を購入したのだけど、
なかなか読み応えがあって良い感じです。
昔、PKIについての概念的な本はちょこっとだけ読みはしたものの、
そのときはWindows環境に特化した実践的手法は掲載されておらず、
結局なんとなくしか理解できなかったのでした。

ADと関連付けさせたエンタープライズCAや、
そのGPO設定の手法など、WEB上で探しても
なかなかしっくりとした解説を得ることができなかった記憶があります。

これを学ぶことにより、いわゆるAD内部でのファイルの暗号化、スマートカードの導入、
WEBサーバのSSL暗号化、安全な無線LAN通信やVPNなどの展開も可能となるとか。
これからちょこちょこと読みといていこうと思ってます。

2010/03/06

あとがき


とまぁ、描きましたが特に何をやるかは決めずに、
その時々に気になったことを描くという感じが楽でよいかな。

証明書サービスはMCP取得時に勉強したり、
実際にテスト環境で作ってみたりしたのだけど、いまだにしっくりきてない。
この前、MS公式解説書を買ったのでそれみて勉強かなー

MCPは現在セカンドショットキャンペーン中。
http://www.microsoft.com/japan/learning/2ndshot/default.mspx

2008がかなり台頭しているのに
中途半端に2003のMCP群を取得しているため
今年中にさっさと2003MCSEを取得して、2008へと気持ちをシフトしたい。
残り2つ。内1つはクライアントなので、Windows7をやってます。

2010/03/04

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年] レポート7

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年]

というわけでようやく最終セッションです。
最後は、プロダクトマネージャー岡本さんより
「Active Directory PMからのご案内」


というわけで、最後はADがこれだけ多くに浸透したので
さらに次の展開、ソリューションを広げていこうというお話でした。
オンライン上にもADに関する技術情報が多く提供されていますし、
またセミナーなども盛んに行われています。
市場が何を望んでいるか、そしていかによりよいサービスを提供できるか。
そこを見極めつつ、知識を増やしていければよいですよね。

というわけでセッションレポート、ようやく終了ですw
最後まで見ていただいた方、ありがとうございました。

次回は、おまけと自分自身の感想がかければいいなーと思ってます。

2010/03/03

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年] レポート6

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年]

レポート6回目。
今回のセミナー一番の目玉である、
「Active Directory エキスパートによるパネルディスカッション」です。
ADの黎明期から現在にいたるまで、
書籍やネット上でよく見かける5人のパネリストによるパネルディスカッション。
パネラーは、横山さん。小鮒さん。国井さん。吉田さん。竹島さんの5名で行われました。
司会はエバンジェリスト 安納さん。とても盛り上がりました。

 

文字ばかりで見難くなっちゃいましたね。。
それにしてもADの過去、現在、そして未来についてADの第一人者の5人から話を聞けたのは
とても貴重な体験となりました。
これに刺激をうけ、さらに精進していきたいと思ってます。

次はラストセッション。
「Active Directory PMからのご案内」についてレポします。

2010/03/02

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年] レポート5

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年]

レポートも5回目。
今回は、ADSI/FIM サポートエンジニアで、
ILM一家のお父さんこと渡辺さんによる、「ADSI のトラブル解決のつぼ」。
僕自身はADSIを利用して操作する機会というのはほとんどないのですが、
わかりやすく、そして面白く解説していただきました。
ブログのほうでもとても詳細に当日の内容が掲載されています。


管理者は見た!~AD と ILM 一家の秘密~
[Info] “Tech Fielders の集い 特別編 おかげさまで Active Directory 10 周年” (2) ADSI チームセッション内容 Ver 1.0

あえて、僕が絵化する必要はないのかも(汗
より詳しく知りたい方は上記ブログを参照してください。

問題の見つけ方として、David J.Agans著「デバッグルール」という本が素晴らしいので
せっかくなのでついでにご紹介。
この本はデバッグについての9つの原則と54のヒントが書かれてます。
僕はプログラムはからっきしなんですが、そんな僕でも読んで感銘をうけた本です。
以下、原則を書いていくと

1。システムを理解する:説明書はちゃんと読もうぜ
2。わざと失敗する:失敗が起きる状況を確認しようぜ
3。考えるのをやめて観察する:観察したあとに行動しても遅くないんだぜ
4。分割して攻略する:いわゆる切り分けしていこうぜ
5。1度に1つずつかえる:一気に色々やると何が何だかわかんないんだぜ
6。履歴をつける:せっかくやったことも意味なくなるんだぜ
7。電源を確認する:実は根本部分が原因だったりするんだぜ
8。新しい視点でものをみる:専門家に師事あおいでもいいんだぜ
9。あなたがしないと問題は解決しない:勝手に直りはしないんだぜ

というわけで名著です。

さて、次回はいよいよ目玉。
「Active Directory エキスパートによるパネルディスカッション」のレポをしたいとおもいます。

2010/03/01

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年] レポート4

Tech Fielders の集い 特別編 [おかげさまで  Active Directory 10 周年]

3セッション目は、ADサポートチーム 北川さんと 渡會さんによる
「グループポリシー よくある質問」。
このサポートチームのブログもよく拝見させて頂いています。
Ask the Network & AD Support Team

上の説明であってるかなぁ・・。
おおまかな概要を描いたにとどめているので、より詳しい話とかは下記リンクどぞ。
@IT Active DirectoryにおけるGPO
TechNet グループ ポリシーのパフォーマンスを最適化する
ITPro グループ・ポリシーの変更をすぐにクライアントへ反映させるには?

セミナーにおいては、このGPO適用の動作に基づいて、
見るべきログや、手法を解説されていました。
特に MPS Reports を使うとOSの様々な情報が取得できて便利だそうです。
今度試してみよう。

次回は4セッション目、 「ADSIトラブル解決のつぼ」をレポしたいと思います。