2012年12月28日金曜日

Fedora 17 インストール GPT で躓いてます。

Fedora 17 を x121e に入れようとして、sda1 が GPT でない
とかでパーティションが切れない。

最近(というか昔からか)ハードウェアに疎く、UEFI とか GPT
とかさっぱりで…

で、どうしても gpt でやりたかったのだけど、デフォルトの
状態のディスクは msdos ラベルというやつらしく、これを
gpt にしなくちゃならんということだ。

anaconda の裏で parted で  mklabel gpt して成功。

parted + gpt は以下が詳しかったのでメモっておく。
http://plaza.rakuten.co.jp/bluearth/diary/201001170000/

2012年12月14日金曜日

System.DirectoryServices.AccountManagement で AD から任意の属性取得

.Net  3.5 から AD の操作をするには System.DirectoryServices.AccountManagement を使う
のが推奨のようだが、UserPrincipal クラスで取得できる属性が限られている。
しかも sAMAccountName が SamAccountName というプロパティ名だったりして使いづらい。

いろいろ調べたら以下の URL に拡張の仕方が書いてあった。

プリンシパルの拡張
http://msdn.microsoft.com/ja-jp/library/bb384372%28v=vs.90%29.aspx

まず、以下のような UserPrincipal クラスのサブクラス(ここでは UserPrincipalExt)を作成。
getValueByAttributeName() つー独自のメソッドを実装し、FindByIdentity() を override してる。

    [DirectoryObjectClass("user")]
    class UserPrincipalExt : UserPrincipal
    {
        public UserPrincipalExt(PrincipalContext context)
            :base(context){}


        public object[] getValueByAttributeName(String attrName)
        {
            return  ExtensionGet(attrName);
        }


        public static new UserPrincipalExt FindByIdentity(
            PrincipalContext context,
            IdentityType identityType,
            string identityValue)
        {
            return (UserPrincipalExt)FindByIdentityWithType(
                context,
                typeof(UserPrincipalExt),
                identityType,
                identityValue);
        }
    }


 

んで、以下みたいに呼び出し。  以下はwWWHomePage を取得しているが
"sAMAccountName" 等の標準の属性も LDAP の名前のまま取得できる模様。

  PrincipalContext ctxt = new PrincipalContext(
      ContextType.Domain, "mydomain", "binduser", "bindpasswd");
  UserPrincipalExt target = UserPrincipalExt.FindByIdentity(
      ctxt, IdentityType.SamAccountName, "myusername");
  object[] res = target.getValueByAttributeName("wWWHomePage");

2012年12月8日土曜日

GetPrivateProfileString() と BOM

VS2010でテキストファイルを新規作成するとデフォルト?で UTF-8 になるぽい。
まぁこれが困るなら自分で文字コードを指定すればいいんだけど、
うっかり何も考えず VS2010 で ini ファイルを作り、それを GetPrivateProfileString()
で読み込もうとしたら全然読めない。

どうも BOM が邪魔してるらしく、素直に US-ASCII に変更したら OK になった。

# Windows はデフォルトが UTF16 なのか UTF8 なのかはっきりして欲しいっす。
# あと UTF-8 で BOM つけるのも何とかしてほしい。

2012年12月6日木曜日

EventLog の InstanceId とかイベントIDとか

Windows の EventLog でイベントIDをエラーコードのようにして
メッセージは別ファイルで管理とかしてみたく調べたら、まぁいろいろ
Web に情報はあり、mc.exe と rc.exe を使えば人間が書いた定義を 
コンパイルしてくれることはわかった。

しかしながら、.Net の EventLog.WriteEvent() の引数である
EventInstance クラスに指定する instanceId 所謂イベントID
mc ファイルに書く MessageId は全部イコールかと思ったら違っ
てた。おそらくイベントID と MessageId は同じ。

じゃ instanceId はなんだろうと思うと、mc.exe でできたヘッダ
ファイルに親切なコメントがあった。 以下の通り
結局 instanceId の下位 16bit がイベントIDということ。

以下の「R」は予約されていてよくわからんが常に 0 の模様。
「C」は customer bit というものらしいがようわからん。
MS が作ったもの以外はビット立てろということ?まぁ、mc.exe の -c 
でこのビットを立てれられるらしいが…よくわからん。


//  Values are 32 bit values laid out as follows:
//
//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//  +---+-+-+-----------------------+-------------------------------+
//  |Sev|C|R|     Facility          |               Code            |
//  +---+-+-+-----------------------+-------------------------------+
//
//  where
//
//      Sev - is the severity code
//
//          00 - Success
//          01 - Informational
//          10 - Warning
//          11 - Error
//
//      C - is the Customer code flag
//
//      R - is a reserved bit
//
//      Facility - is the facility code
//
//      Code - is the facility's status code