Windows Dev. Site

Office365をPowerShellで管理

Office365を使ってみて、このユーザの管理とかPowerShellでやってみたいと思い、試してみました。

前提条件はOffice365が使える状態になっていることです。以下のような画面で表示される、ユーザを表示したいと思います。
o365admin

まずコマンドレットをインストールする必要があります。以下のサイトから、サインインアシスタント、OnlineServicesモジュールをインストールしました。
環境 : Windows 8 Pro

http://onlinehelp.microsoft.com/office365-enterprises/hh124998.aspx

o365cmdinst

インストールが終了して、以下のコマンドで、多数のMSOnline用のコマンドレットが表示されればOKです。

Get-Command -module MSOnline

準備ができたら以下のコマンドを順に実行していきます。

Import-Module MSOnline
$Cred = Get-Credential
$Sess = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $Cred -Authentication Basic -AllowRedirection
Import-PSSession $Sess
Connect-MsolService –Credential $Cred

Get-MsolUser

出力結果

o365getuser

参考サイト

http://technet.microsoft.com/ja-jp/magazine/hh750396.aspx

IronPython で PowerShell

PowerShellは便利ですが、ちょっとしたプログラムを組もうとすると、やはりプログラム言語に分があります。そこでIronPythonからやってみました。Linuxで言えば、BashとPerlのような関係に近いかもしれません。(いやだいぶ違うかも・・こちらのがコマンドの移行がかなり簡単)

test.py

import powershell as ps

print ps.shell.get_command()	# gc

print ps.shell.get_childitem().sort("length")	# ls | sort -property length

print ps.shell.get_process("ipy")[0].ProcessName
# 'ipy'


http://ironpython.codeplex.com/releases/view/12482 にある IronPython-2.6-Samples.zip を利用しました。powershell.pyをtest.pyと同じフォルダにおいて、実行します。version2.6用のようですが、ipy 2.7.3でも動作しました。

環境 : Windows7 コマンドプロンプト

ipy test.py

Pythonでは、PowerShellコマンドのハイフンをアンダースコアに変更した名前になっています。パイプやプロパティ指定もできます。

Python使えるなぁ~

WindowsAzure Storage Python ライブラリ

WinowsAzure管理画面
az_storage

クラウドならではの特徴として、ストレージがあります。AzureではSQLも使えますが、クラウドらしさからいってAzure Table Storageというものを使ってみようと思います。
Azure Storageには、Blog Storage, Storage Queuesというのもありますが、Tableはキー/バリュー形式で一番汎用的と思うので、選択しました。

さて問題は実装の仕方ですが、サーバサイドでC#、Node.js、Pythonのどれでやろうか、と思いましたが、とりあえずストレージの部分だけテストしたかったので、Pythonでクライアントからアクセスする方法にしました。(サーバサイドだとストレージ以外の部分が面倒だつたので・・)

環境は、すでにPythonがインストールされているMac OS X Lionにしました。
まずは、Azureライブラリのインストール。

sudo eazy_install pip
sudo pip install azure

アカウント名、プライマリーキーは、Azureの管理画面からコピペ
create.py

from azure.storage import *
ts = TableService('アカウント名', 'プライマリキー')
ts.create_table('testTable')

insert.py

from azure.storage import *
ts = TableService('アカウント名', 'プライマリキー')
ts.insert_entity('testTable',{
    'PatitionKey':'key01',
    'RowKey':'1',
    'name':'xframe'
    })

get.py

from azure.storage import *
ts = TableService('アカウント名', 'プライマリキー')
entity = ts.get_entity('testTable', 'key01', '1')
print entity.name

以下の順でコマンド実行すると、

python create.py
python insert.py
python get.py

‘xframe’とコンソールに表示されます。
ここから発展させれば、ストレージについていろんなテストができそうです。

Node.js / WebMatrix を Azureで公開

var http = require('http');

http.createServer(function (req, res) {
   
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end('Hello, world! Sample');

}).listen(process.env.PORT || 8080);

VisualStudioでなく、簡単にWebアプリケーションを開発、AzureにデプロイできるWebMatrixというツールがあるということを知りました。
上のようなNode.jsのソース(テンプレートのまま)をローカルで動作確認をして、すぐにAzureに公開ができます。
下のように「実行」(ローカル)「発行」(Azure)のボタンを押すだけ。(Azure以外も可能)

webmx4

Azure側は、管理画面から、Webサイトを作成します。
ここで発行プロファイルをダウンロードして、

webmx1

この発行プロファイルを、WebMatrix側で読み込みます。
これで、WebMatirxとAzureが紐付られます。

webmx2

あとは手順に従いデプロイします。

webmx3

Azureで設定したURLが表示されるので、これをクリックして表示確認できます。

とても簡単にできますし、他にも紹介されているサイトがたくさんありますが、Azureまわりに限らず、最近のMicrosoftの製品・サービスはバージョンアップによってよくインターフェイスや操作性が変わったりするので、この時点でできた記録をとっておく意味でも記事にしました。(実際にやってみると記憶にも残りますし、たぶんすぐ参考にならなくなるかもしれませんが、変更があったときにどこを基準に考えるか、ということが結構大切なときがあると思う今日このごろ・・)
それだけホットということですね。

次の課題は、Azureのストレージです。クラウドならではのストレージに興味があります。

Java Native Interface : C++/CLI

.NETフレームワークのC++/CLIの柔軟性を示す例として、一つの文字列を4つの方法でコンソール出力をしてみた。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <jni.h>
#include <iostream>

using namespace System;

void JavaPrint(char*);

int main(array<System::String ^> ^args)
{
	char str[100];

	sprintf(str, "Hello World\n");

	// .Net
	String^ s = gcnew String(str);
	Console::Write(s);

	// Win
	HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	WriteConsole(hStdout, (CONST VOID *)str, (DWORD)strlen(str), NULL, NULL);

	// Std C
	printf("%s", str);

	// Java
	JavaPrint(str);

	std::cout << "Hit any key ..." << std::endl;
	getchar();
    return 0;
}

void JavaPrint(char *str)
{
	JNIEnv* env;
    JavaVM* jvm;
	JavaVMOption options[3];
	JavaVMInitArgs vm_args;

    options[0].optionString = "-Xmx128m";
    options[1].optionString = "-verbose:gc";
    options[2].optionString = "-Djava.class.path=C:/temp";

    vm_args.version = JNI_VERSION_1_6;
    vm_args.options = options;
    vm_args.nOptions = 3;

	JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
	
    jclass clazz = env->FindClass("JPrint");
	jmethodID mid = env->GetStaticMethodID(clazz, "SystemPrint", "(Ljava/lang/String;)V");
	env->CallStaticVoidMethod(clazz, mid, env->NewStringUTF(str));

    jvm->DestroyJavaVM();
}

これを実行すると以下のようになります。

Console4

Javaのコードはコンパイルして、C:\tempにclassファイルを配置しておきます。

public class JPrint{
	public static void SystemPrint(String arg){
		System.out.print(arg);
	}
}

なんか面白い。自己満足!(ネタ的にはちょっと古いけど、残しておきたかったので)
重要なのは、.NETにもJavaにも同時にアクセスできてしまうということです。
(こういうの過去資産の活用に使えるんですよね。)

最近C++/CXというものもでてきましたが、ネイティブとも.NETとも違うまた新しいスタイル(WinRT)の開発をすることができます。C++/CLIも陳腐化してしまうのかなぁ。
また勉強しないと・・

Facebook OAuth / ASP.NET

Facebookを使った認証をこれまでPHPで実装したことがありましたが、ASP.NET MVC4 Webアプリケーションのテンプレートを使うと、恐ろしいほど簡単にできてしまったので、そのメモです。

環境 : VisualStudio2012 / Windows 8

テンプレートをビルドすると、App_Start->AuthConfig.csの中には、以下のように、Twitter,Microsoftアカウントのものも用意されます。
今回FacebookのAppIDと、AppSecretを有効にしてコンパイルするだけです。

public static class AuthConfig
{
    public static void RegisterAuth()
    {
        //OAuthWebSecurity.RegisterMicrosoftClient(
        //    clientId: "",
        //    clientSecret: "");

        //OAuthWebSecurity.RegisterTwitterClient(
        //    consumerKey: "",
        //    consumerSecret: "");

        OAuthWebSecurity.RegisterFacebookClient(
            appId: "******************",
            appSecret: "*********");

        //OAuthWebSecurity.RegisterGoogleClient();
    }
}

これでデフォルト画面のログインボタンを押すと、Facebookのボタンがでてきます。

screenlogin

Facebookアプリ開発が初めての方は、開発者登録をしておく必要があります。

https://developers.facebook.com/apps

新規アプリの追加画面で、以下のように「Facebookでログインするウェブサイト」にURLを入れ保存します。

fb1

保存すると、「Changes saved.なお、変更が反映されるまでにseveral minutesかかる場合があります。」とルー語が表示されますので、これで完了です。
このURLは、開発マシンのlocalhostでもOKです。

Azure Cmdlet

WindowsAzureをPowerShellを使って、管理しようと試してみました。(Windows8でテスト)

gcm -module Azure

WindowsAzureをPowerShellで管理するときに使うコマンドレット一覧が表示されます。
コマンドを使う前に、以下のことをする必要があるようです。

Import-AzurePublishSettingsFile <ダウンロードした資格情報のファイル>
Set-AzureSubscription -SubscriptionName <サブスクリプション名>

作成したサービス内容でも出してみましょう。

Get-AzureService

PowerShellによるAzureの情報表示がかなり簡単にできてしまいました。
しかし、ネットや書籍などでいろいろと調べましたが、情報の時期によってコマンドの使い方も違ったりして、いろいろと混乱しました。最近Windows8の登場で新しくなって部分の情報がまだ不足している感じがあります。
これはAzure以外のことを調べていてもそう思いました。それだけホットということなのでしょう。

azure2

あと、Thumprintは、VisualStudioでクラウドに配置をすると、cert:\CurrentUser\Myに作成されるようです。

Windows Azure セットアップ

はじめてWindowsAzureをつかってみました。
これまで情報だけでは知っていて、なんかめんどくさそうだなぁと思っていましたが、実際にやってみるととても簡単なのがわかります。
作業した流れについて以下に書いてみたいと思います。

まずどんな構成のものをつくるかですが、Webのインターフェイスがあって、なんからの処理結果をストレージに記録でき、クラウドの特色を生かせるものということで、WebロールでAzureストレージサービスを使うことにしました。

1) Live ID アカウント作成
  live.jpサイトから登録
2) WindowsAzure サブスクリプション購入
Azureサイトで登録
3) クラウドサービス作成
Azureサイト管理者ページより
4) WindowsAzureサンプルアプリ作成
VisualStdudioでビルド と Azureエミュレータで動作確認
5) WindowsAzureサンプルアプリ発行
  資格情報をAzureサイトからダウンロードして、VisualStudioにインポート
  サンプルアプリデプロイ
6) クラウドサービスにアクセス
  Auzreサイト管理ページに記載の***.cloudapp.netのURLにブラウザでアクセス

エミュレータで動作確認しているとき、アプリ側だけみてみるとASP.NETとかわりないのですが、ServiceDeployementsの画面でコンソールで何やら表示しているのを見ると、クラウドっぽくて面白いです。

azure1

まだまだいろんな機能がありますが、今度はADFSを使ってみたいと思っています。

PowerShell

やっぱり最初はこのネタで。
登場したときから、注目していました。PowerShellは以下二つの理由で興味があります。

  1. Unixシェルの進化バージョン
  2. GUIのWindowsでなぜCUI

現在でも仕事でUnixのシェルスクリプトは多用しています。このGUIの時代に、まだまだテキスト編集や、出力結果を渡したりするのにとても便利です。cat, sed, awk, grep などなど必需品です。
しかし、これらテキストベースであるため、ちょっとしたプログラムミスで期待した出力にならなかったり、とても注意が必要です。たとえば、CSVファイルの編集などしたいとき、カンマ区切りを考慮して目的のデータを取り出したりするときなど、実際の処理の流れとは別に、一文字単位の変換など細かいところまでコーディングする必要がありました。
PowerShellでは、テキストベースではなく、オブジェクトベースでパイプラインを構築できるので、処理の流れに集中することができます。Unixのように各コマンドのシンタックスに違いがなく、どのコマンドも統一的に扱うことができます。
これらは後発の強みですので、当然といば当然ですが、GUIのWindowsでこのようなものが作られたというところに、CUIの必要性を証明していてとても興味深いです。(パイプという概念を導入したUnixは偉大ですね)

Get-ChildItem | where{$_.length -gt 1000} | 
  select  Name,Length | sort -Property length

このような感じで、ファイルリスト(dir)をサイズでソースすることが簡単にできます。(1000byte以上を対象。エイリアスも入っていて統一感がありませんが、SQL的に見えるのでこうしました。)
煩わしい文字列操作を意識せず、オブジェクトの操作ができるのは、直感的にデータ操作ができてとても便利です。
あと.Net APIとの親和性など、まだまだ魅力はあるのですが、勉強を進めながら使えるものを増やしていきたいと思っています。
はっきり言って、すごい好みです!