わんくま同盟 Blog's

わんくま同盟

メニュー

わんくま同盟

  勉強会情報

  メンバリスト

掲示板

ブログ

リンク

統計

わんくま同盟メンバ

わんくま同盟わんくま同盟

わんくま同盟メンバの最新の記事

.NETラボ勉強会セッション

2月28日、.NETラボ勉強会でセッションを担当させていただきました。

 

セッションで使ったスライドです。

グループのメンバーをすべて取得する

http://www.slideshare.net/mitchin227/all-members

 

セッションで使ったサンプルアプリケーションです。

VB版:

https://directoryvb.codeplex.com/SourceControl/latest

C#版:

https://directorycs.codeplex.com/SourceControl/latest

Visual Studio 2013(.NET 4.5.1)

※ソースコード自体は .NET 4 相当です。

ダウンロードは Download のリンクからできます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/03/01 21:49 by mitchin(mitchin@wankuma.com)

[WindowsPhone8.1]ついに日本にもWindows Phoneの波が来た!(これは本物)

MWC 2015が開催中なのかもですが、Windows Phoneの日本投入のニュースが続いています。


2015.02.23 ニュースリリース|マウスコンピューター、Windows Phone ベースのデバイス開発契約を締結し、開発着手のお知らせ|マウスコンピューター


SIMフリースマートフォンブランドfreetel 最新のWindows Phone OS搭載モデルを 2015年夏までに国内発売 - CNET Japan


京セラ、MWC 2015に出展--ソーラーチャージやWindows Phone搭載の高耐久モデルも - CNET Japan

Windows Phoneは、8.1の段階でもWindowsストアアプリ(要はPCのWindows 8.1でのアプリ形式)とコードの互換性が高く、universal Windowsアプリというソースプロジェクト構造で作成することでロジックや(やろうと思えば画面デザインも)共有化できます。これにXbox Oneも加えて、デスクトップ、タブレット、スマホ、リビングのゲーム機と作る側はコード共通化、使う側はデータ共有化が行えます。

日本でWindows 8タブレットがはやったのが2014年ですが、本当のWindows 8の姿は日本でこそスマホが入ってないと感じ取れなかったはずです。

そんな日本の消費者の不利益をやっと解消できるのが2015年だとついにいえそうです。

なぜ、今年なんだ?という感じもしますが、日本マイクロソフトのエヴァンジェリストである高橋忍さんの努力がやっと実を結んだということでしょうし、Windows 10ではWindows 10 for Phoneのように更に統合がすすんでいくということも影響しているでしょうし、SIMロックフリーという選択肢が低価格SIMが2014年に一般化してスーパーなども参入したという実績もあるでしょうし、とにかく、日本語化は行われていたOSですがから、技適費用を払ってもキャリア以外の販売路線で元がとれる!と判断できる状況になったんでしょうね。

私の取り組んでいるAED検索もすでにWindows Phone 8.1向けに公開しています。

日本の開発者で多くの人が日本で発売していないWindows Phoneの開発技術を磨いてきていました。なので、本当に発売が開始され誰でもが買えるようになったときに、今間と違った展開がすでに用意されていると思っていいでしょう。

Windows Phone Archでも日本での発売に合わせて色々イベントを開催していきたいと思っています。

http://wp-arch.jp/

posted @ 2015/02/27 11:21 by 初音 玲

サンプルアプリの更新分をCodePlexの方に反映

グループのネストしているすべてのメンバーを表示する画面の追加に伴い、サンプルアプリの更新分を CodePlex の方に反映しました。

 

サンプルアプリ:VB版C#版(ダウンロードは Download のリンクからできます)

 

主な更新箇所は次の通りです。

クラスライブラリ:

ForeignSecurityPrincipal クラスVBC#(追加)

DirectoryAccess クラスVBC#(GetMembers メソッドを追加)

 

Windows アプリ:

AllMemberList クラスVBC#(フォームを追加)

GroupList クラスVBC#(ボタンとフォームの呼出しを追加)

 

Web アプリ:

AllMemberList クラスVBC#(フォームを追加)

GroupList クラスVBC#(ボタンとフォームの呼出しを追加)

directory.js:showAllMemberList 関数を追加

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/25 21:21 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWebアプリのコード(C#)

グループのネストしているすべてのメンバーを表示する画面の Web アプリの C# のコードです。

//イベントハンドラ

protected void Page_Load(object sender, EventArgs e)

{

  if (String.IsNullOrEmpty(Request.QueryString["name"]))

  {

    return;

  }

  if (this.IsPostBack)

  {

    return;

  }

  this.AddChildNode();  //子ノードを追加

}

 

//プライベートメソッド

//子ノードを追加

private void AddChildNode()

{

  using (var group = DomainGroup.FindByName(Request.QueryString["name"]))   //グループを検索

  {

    var node = new TreeNode(group.Name);

    this.MemberTreeView.Nodes.Add(node);

    var members = DirectoryAccess.GetMembers(group);   //グループのメンバーを取得

    foreach (var member in members)

    {

      this.AddChildNode(node, member);   //子ノードを追加

      member.Dispose();

    }

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainObject member)

{

  var childNode = CreateNode(member);  //ノードを作成

  node.ChildNodes.Add(childNode);

  if (member.Category == CategoryType.Group)

  {

    var subMembers = DirectoryAccess.GetMembers((DomainGroup)member);   //グループのメンバーを取得

    foreach (var subMember in subMembers)

    {

      this.AddChildNode(childNode, subMember);   //子ノードを追加

      subMember.Dispose();

    }

  }

}

 

//指定したメンバーのノードを作成

private TreeNode CreateNode(DomainObject member)

{

  string displayName;    //表示するテキスト

  switch (member.Category)

  {

    case CategoryType.User:

      var user = (DomainUser)member;

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name);

      break;

    case CategoryType.Group:

      var group = (DomainGroup)member;

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath);

      break;

    case CategoryType.Computer:

      var pc = (Computer)member;

      string sp = null;

      if (pc.OperatingSystemServicePack != null)

      {

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP");

      }

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role);

      break;

    default:   //CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name);

      break;

  }

  return new TreeNode(displayName, member.Name);

}

 

内容的には Windows アプリと同じです。説明は VB の方に書いてますのでそちらをご覧ください。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/22 18:00 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWebアプリのコード(VB)

グループのネストしているすべてのメンバーを表示する画面の Web アプリの VB のコードです。

'イベントハンドラ

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

  If String.IsNullOrEmpty(Request.QueryString("name")) Then

    Return

  End If

  If Me.IsPostBack Then

    Return

  End If

 

  Me.AddChildNode()   '子ノードを追加

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode()

  Using group = DomainGroup.FindByName(Request.QueryString("name"))   'グループを検索

    Dim node As New TreeNode(group.Name)

    Me.MemberTreeView.Nodes.Add(node)

    Dim members = DirectoryAccess.GetMembers(group)   'グループのメンバーを取得

    For Each member In members

      Me.AddChildNode(node, member)   '子ノードを追加

      member.Dispose()

    Next

  End Using

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, member As DomainObject)

  Dim childNode = CreateNode(member)   'ノードを作成

  node.ChildNodes.Add(childNode)

  If member.Category = CategoryType.Group Then

    Dim subMembers = DirectoryAccess.GetMembers(DirectCast(member, DomainGroup))   'グループのメンバーを取得

    For Each subMember In subMembers

      Me.AddChildNode(childNode, subMember)   '子ノードを追加

      subMember.Dispose()

    Next

  End If

End Sub

 

'指定したメンバーのノードを作成

Private Function CreateNode(member As DomainObject) As TreeNode

  Dim displayName As String   '表示するテキスト

  Select Case member.Category

    Case CategoryType.User

      Dim user = DirectCast(member, DomainUser)

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name)

    Case CategoryType.Group

      Dim group = DirectCast(member, DomainGroup)

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath)

    Case CategoryType.Computer

      Dim pc = DirectCast(member, Computer)

      Dim sp As String = Nothing

      If pc.OperatingSystemServicePack IsNot Nothing Then

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP")

      End If

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role)

    Case Else   'CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name)

  End Select

  Return New TreeNode(displayName, member.Name)

End Function

 

内容的には Windows アプリと同じです。

対象のグループの情報は AddChildNode メソッドでクエリ文字列から name(名前)を取得して DomainGroup.FindByName メソッドを呼び出して取得してます。

DomainGroup.FindByName メソッドはグループリスト画面の詳細表示用 FormView のデータソースになってる ObjectDataSource の SelectMethod に指定されてるメソッドです。

※実装コードはこちら

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/21 16:13 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWindowsアプリのコード(C#)

グループのネストしているすべてのメンバーを表示する画面の Windows アプリの C# のコードです。

//パブリックコンストラクター

public AllMemberList(DomainGroup group)

{

  InitializeComponent();

  this.AddChildNode(group);  //子ノードを追加

  this.MemberTreeView.ExpandAll();

}

 

//プライベートメソッド

//子ノードを追加

private void AddChildNode(DomainGroup group)

{

  var imageIndex = (int)group.Category;

  var node = new TreeNode(group.Name, imageIndex, imageIndex);

  this.MemberTreeView.Nodes.Add(node);

  var members = DirectoryAccess.GetMembers(group);   //グループのメンバーを取得

  foreach (var member in members)

  {

    this.AddChildNode(node, member);   //子ノードを追加

    member.Dispose();

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainObject member)

{

  var childNode = CreateNode(member);  //ノードを作成

  node.Nodes.Add(childNode);

  if (member.Category == CategoryType.Group)

  {

    var subMembers = DirectoryAccess.GetMembers((DomainGroup)member);   //グループのメンバーを取得

    foreach (var subMember in subMembers)

    {

      this.AddChildNode(childNode, subMember);   //子ノードを追加

      subMember.Dispose();

    }

  }

}

 

//指定したメンバーのノードを作成

private TreeNode CreateNode(DomainObject member)

{

  string displayName;    //表示するテキスト

  var fontColor = Color.Black;

  switch (member.Category)

  {

    case CategoryType.User:

      var user = (DomainUser)member;

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name);

      fontColor = Color.Brown;

      break;

    case CategoryType.Group:

      var group = (DomainGroup)member;

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath);

      fontColor = Color.Blue;

      break;

    case CategoryType.Computer:

      var pc = (Computer)member;

      string sp = null;

      if (pc.OperatingSystemServicePack != null)

      {

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP");

      }

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role);

      fontColor = Color.Green;

      break;

    default:   //CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name);

      break;

  }

  var imageIndex = (int)group.Category;

  return new TreeNode(displayName, imageIndex, imageIndex) { Name = member.Name, ForeColor = fontColor };

}

 

説明は VB の方に書いてますのでそちらをご覧ください。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/19 21:15 by mitchin(mitchin@wankuma.com)

グループのネストしているすべてのメンバーを表示する画面のWindowsアプリのコード(VB)

グループのネストしているすべてのメンバーを表示する画面の Windows アプリの VB のコードです。

'パブリックコンストラクター

Public Sub New(group As DomainGroup)

  InitializeComponent()

  Me.AddChildNode(group)   '子ノードを追加

  Me.MemberTreeView.ExpandAll()

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode(group As DomainGroup)

  Dim node As New TreeNode(group.Name, group.Category, group.Category)

  Me.MemberTreeView.Nodes.Add(node)

  Dim members = DirectoryAccess.GetMembers(group)   'グループのメンバーを取得

  For Each member In members

    Me.AddChildNode(node, member)   '子ノードを追加

    member.Dispose()

  Next

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, member As DomainObject)

  Dim childNode = CreateNode(member)   'ノードを作成

  node.Nodes.Add(childNode)

  If member.Category = CategoryType.Group Then

    Dim subMembers = DirectoryAccess.GetMembers(DirectCast(member, DomainGroup))   'グループのメンバーを取得

    For Each subMember In subMembers

      Me.AddChildNode(childNode, subMember)   '子ノードを追加

      subMember.Dispose()

    Next

  End If

End Sub

 

'指定したメンバーのノードを作成

Private Function CreateNode(member As DomainObject) As TreeNode

  Dim displayName As String   '表示するテキスト

  Dim fontColor As Color

  Select Case member.Category

    Case CategoryType.User

      Dim user = DirectCast(member, DomainUser)

      displayName = String.Format("{0}({1}{2}:{3}/{4})",

        user, user.LastName, user.FirstName, user.DisplayPath, user.Name)

      fontColor = Color.Brown

    Case CategoryType.Group

      Dim group = DirectCast(member, DomainGroup)

      displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath)

      fontColor = Color.Blue

    Case CategoryType.Computer

      Dim pc = DirectCast(member, Computer)

      Dim sp As String = Nothing

      If pc.OperatingSystemServicePack IsNot Nothing Then

        sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP")

      End If

      displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role)

      fontColor = Color.Green

    Case Else   'CategoryType.ForeignSecurityPrincipal

      displayName = String.Format("{0}({1})", member, member.Name)

  End Select

  Return New TreeNode(displayName, member.Category, member.Category) With {.Name = member.Name, .ForeColor = fontColor}

End Function

 

コンストラクターで受け取っているグループは、呼出し元のグループリスト画面で選択されたグループです。

まず、AddChildNode(DomainGroup) メソッドで TreeView に対象グループのノードを追加してます。

次に DirectoryAccess.GetMembers メソッドを呼び出してグループのメンバーを取得し、そのメンバーに対して AddChildNode(TreeNode, DomainObject) メソッドを呼び出して ノードに子ノードを追加してます。

AddChildNode(TreeNode, DomainObject) メソッドでは、CreateNode メソッドを呼び出してメンバーのノードを作成してノードに追加してます。

メンバーがグループの場合は再帰的に呼び出してメンバーのノードを追加してます。

CreateNode メソッドでは、メンバーの種類ごとに表示するテキストとフォントの色を設定してノードを作成してます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/18 20:32 by mitchin(mitchin@wankuma.com)

[AED]AEDオープンデータプラットフォームがLODチャレンジJapan 2014で優秀賞受賞


LODチャレンジJapan2014 受賞作品発表 at LODチャレンジブログ

AEDオープンデータプラットフォームがLODチャレンジJapan 2014でアプリケーション部門優秀賞と日本マイクロソフト賞を頂きました!

様々な自治体の担当者様、データを整形して送っていただいたみなさんのご協力あってことその受賞ですし、とりくみが評価されたと同時に期待されての受賞です。

2015年はますますデータ拡充、共通語彙基盤ver2.2準拠エンドポイントの作成などを行っていきます。また、Micorosoft Azure SQL Databaseの列カラムストア化なども実施しますますの高パフォーマンスを実現していきます。

今後ともよろしくお願いします。

posted @ 2015/02/17 10:02 by 初音 玲

DirectoryAccess.GetMembers メソッド

DirectoryAccess クラスに追加した GetMembers メソッドのコードです。(これまでのコードはこちら VB C#

VB

'指定したドメイングループのメンバーを取得します。

Public Shared Function GetMembers(group As DomainGroup) As IList(Of DomainObject)

  If group Is Nothing Then

    Throw New ArgumentNullException("group", "group が Nothing です。")

  End If

  If CanConnectDomain = False Then  'ドメインに接続できない時

    Return New List(Of DomainObject)()

  End If

 

  Dim objects As New List(Of DomainObject)()

  Using root = GetRootEntry()   'ルートのDirectoryEntryを取得

    'このグループのメンバーを検索

    Dim filter = String.Format("(memberOf={0})", group.Entry.Properties.Item("distinguishedName").Value)

    Using searcher As New DirectorySearcher(root, filter)

      Using results = searcher.FindAll()

        For Each res As SearchResult In results

          objects.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), DomainObject))

        Next

      End Using

      'このグループをプライマリ グループとしているメンバーを検索

      searcher.Filter = String.Format("(&(|(objectCategory={0})(objectCategory={1}))(primaryGroupID={2}))",

        CategoryType.User, CategoryType.Computer, group.Token)

      Using results = searcher.FindAll()

        For Each res As SearchResult In results

          objects.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), DomainObject))

        Next

      End Using

    End Using

  End Using

  Return objects.OrderBy(Function(o) o.ToString()).ToList()

End Function

 

C#

//指定したドメイングループのメンバーを取得します。

public static IList<DomainObject> GetMembers(DomainGroup group)

{

  if (group == null)

  {

    throw new ArgumentNullException("group", "group が null です。");

  }

  if (CanConnectDomain == false//ドメインに接続できない時

  {

    return new List<DomainObject>();

  }

 

  var objects = new List<DomainObject>();

  using (var root = GetRootEntry())   //ルートのDirectoryEntryを取得

  {

    //このグループのメンバーを検索

    var filter = String.Format("(memberOf={0})", group.Entry.Properties["distinguishedName"].Value);

    using (var searcher = new DirectorySearcher(root, filter))

    {

      using (var results = searcher.FindAll())

      {

        foreach (SearchResult res in results)

        {

          objects.Add((DomainObject)CreateInstance(res.GetDirectoryEntry()));

        }

      }

      //このグループをプライマリ グループとしているメンバーを検索

      searcher.Filter = String.Format("(&(|(objectCategory={0})(objectCategory={1}))(primaryGroupID={2}))",

        CategoryType.User, CategoryType.Computer, group.Token);

      using (var results = searcher.FindAll())

      {

        foreach (SearchResult res in results)

        {

          objects.Add((DomainObject)CreateInstance(res.GetDirectoryEntry()));

        }

      }

    }

  }

  return objects.OrderBy(o => o.ToString()).ToList();

}

 

1 回目の検索はグループのメンバーの検索で、所属するグループがこのグループであるオブジェクトを検索してます。

プライマリ グループを除いて 所属するグループは memberOf 属性で取得できるので、この値がグループの distinguishedName 属性(識別名)の値に一致するものがあれば、メンバーはこのグループに所属していることになります。

例えば Enterprise Admins グループの distinguishedName 属性の値は次のようになってます。

 CN=Enterprise Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

また Administrator の memberOf 属性の値は次のようになってます。

 CN=Group Policy Creator Owners,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Domain Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Enterprise Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Schema Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

 CN=Administrators,CN=Builtin,DC=proceed,DC=pbyk,DC=com

memberOf 属性も distinguishedName 属性も値の書式が同じなので、これを検索条件として使ってます。

 

2 回目の検索はこのグループをプライマリ グループとしているユーザーかコンピューターを検索してます。

既定では、プライマリ グループは次のようになります。

 ユーザー:Domain Users

 ドメイン コントローラー:Domain Controllers

 ドメイン コントローラー以外のコンピューター:Domain Computers

ユーザーかコンピューターの primaryGroupID 属性の値が グループの primaryGroupToken 属性の値(Token プロパティに保持)と一致すれば このグループに所属していることになります。

 

抽出されたメンバーは表示する名前でソートしてます。

 

内部で呼び出している CreateInstance メソッドを変更しました。太字部分の 1 行だけです。

VB

Private Shared Function CreateInstance(entry As DirectoryEntry) As DirectoryObject

  Dim category As CategoryType

  If [Enum].TryParse(Of CategoryType)(entry.SchemaClassName, True, category) = False Then

    Throw New ArgumentException("entry の種類が CategoryType に該当しません。", "entry")

  End If

 

  Select Case category

    Case CategoryType.User

      If CanConnectDomain Then    'ドメインに接続できる時

        Return New DomainUser(entry)

      Else    'ドメインに接続できない時

        Return New LocalUser(entry)

      End If

    Case CategoryType.Group

      If CanConnectDomain Then    'ドメインに接続できる時

        Return New DomainGroup(entry)

      Else    'ドメインに接続できない時

        Return New LocalGroup(entry)

      End If

    Case CategoryType.Computer

      Return New Computer(entry)

    Case CategoryType.PrintQueue

      Return New PrintQueue(entry)

    Case CategoryType.Volume

      Return New Volume(entry)

    Case Else

      Return New ForeignSecurityPrincipal(entry)

  End Select

End Function

 

C#

private static DirectoryObject CreateInstance(DirectoryEntry entry)

{

  CategoryType category;

  if (Enum.TryParse<CategoryType>(entry.SchemaClassName, true, out category) == false)

  {

    throw new ArgumentException("entry の種類が CategoryType に該当しません。", "entry");

  }

 

  switch (category)

  {

    case CategoryType.User:

      if (CanConnectDomain)    //ドメインに接続できる時

      {

        return new DomainUser(entry);

      }

      else    //ドメインに接続できない時

      {

        return new LocalUser(entry);

      }

    case CategoryType.Group:

      if (CanConnectDomain)    //ドメインに接続できる時

      {

        return new DomainGroup(entry);

      }

      else    //ドメインに接続できない時

      {

        return new LocalGroup(entry);

      }

    case CategoryType.Computer:

      return new Computer(entry);

    case CategoryType.PrintQueue:

      return new PrintQueue(entry);

    case CategoryType.Volume:

      return new Volume(entry);

    default:

      return new ForeignSecurityPrincipal(entry);

  }

}

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/15 14:05 by mitchin(mitchin@wankuma.com)

[NETMF]FEZ SpiderをPCから切り離して動作させるには

FEZ Spiderは.NET Micro Frameworkが動作します。

また、.NET Gadgeteerという仕組みでも対応しているため、Visual Studio上でボードやセンサーなどを表示して接続を行い、実機でも同じように接続しておけば、例えば「ボードのAポートに温度センサーがつながっているから、温度センサーの値を読むためにポートAの値を調べよう」ではなく「温度センサーの値を調べよう」というコードが記述できます。

DISP04

PC上で稼働するVisual Studioからプログラムを転送するのも、左上にあるUSB Clientを使ってPCとUSB接続を行っておけば、Visual Studioで「デバック実行」するだけで、FEZ Spiderにアプリが送られてリモートデバッグ状態で動作してくれます。

 

それでは、PCと切り離してFEZ Spider単体でプログラムを動かすにはどうしたらいいでしょうか。

答えは簡単。

PCと切り離して電源をOnにすればプログラムが起動される

です。

FEZ Spiderのプログラム格納領域は不揮発性メモリになっているので、PCと接続していたUSBを外してもプログラムが消えることがありません。USBの接続先をモバイルバッテリーやUSB給電源に接続してあげればプログラムが再起動します。

.NET Micro Frameworkをやってきた人にとっては当たり前といえば当たり前すぎるのか、情報としてきちんとのっているところがなかったので不思議に思って調べてみました。

考えてみたらなかなかすごい仕組みですよね。

posted @ 2015/02/14 15:58 by 初音 玲

ForeignSecurityPrincipal クラス

グループのネストしているすべてのメンバーを表示する画面の追加に伴いクラスライブラリ側にクラスを追加しました。

今まで扱ってきたのは ユーザー、グループ、コンピューター、OU、プリンター、共有フォルダーの 6 オブジェクトで、これらのオブジェクトを表す DirectoryEntry をラップした専用のクラスで表しています。

今回、外部のセキュリティ プリンシパルがグループのメンバーに含まれるようになるので、これを表すクラスを追加しました。

 

ForeignSecurityPrincipal クラス(System.Security.Principal 名前空間をインポートしてます)

VB

Public NotInheritable Class ForeignSecurityPrincipal

  Inherits DomainObject

 

#Region " プライベートフィールド "

  Private ReadOnly _readableName, _displayName As String

#End Region

 

#Region " フレンドコンストラクター "

  'DirectoryEntry を指定して ForeignSecurityPrincipal クラスの新しいインスタンスを初期化します。

  Friend Sub New(entry As DirectoryEntry)

    MyBase.New(entry)

 

    Dim objectSid = DirectCast(entry.Properties.Item("objectSid").Value, Byte())

    Dim sid = New SecurityIdentifier(objectSid, 0'SID

    Dim account = DirectCast(sid.Translate(GetType(NTAccount)), NTAccount'アカウントに変換

    _readableName = account.Value   'NT AUTHORITY\○○ => ToStringメソッドでも同じ

    _displayName = IO.Path.GetFileName(account.Value)   'NT AUTHORITY\○○ の ○○部分

  End Sub

#End Region

 

#Region " パブリックプロパティ "

  '表示用の名前を取得します。

  Public ReadOnly Property DisplayName As String

    Get

      Return _displayName

    End Get

  End Property

 

  '読み取り可能な名前を取得します。

  Public ReadOnly Property ReadableName As String

    Get

      Return _readableName

    End Get

  End Property

#End Region

 

#Region " パブリックメソッド "

  '表示用の名前を返します。

  Public Overrides Function ToString() As String

    Return Me.DisplayName

  End Function

#End Region

End Class

 

C#

public sealed class ForeignSecurityPrincipal : DomainObject

{

  #region プライベートフィールド

  private readonly string _readableName, _displayName;

  #endregion

 

  #region インターナルコンストラクタ

  //DirectoryEntry を指定して ForeignSecurityPrincipal クラスの新しいインスタンスを初期化します。

  internal ForeignSecurityPrincipal(DirectoryEntry entry)

    : base(entry)

  {

    var objectSid = (byte[])entry.Properties["objectSid"].Value;

    var sid = new SecurityIdentifier(objectSid, 0);   //SID

    var account = (NTAccount)sid.Translate(typeof(NTAccount));  //アカウントに変換

    _readableName = account.Value;   //NT AUTHORITY\○○ => ToStringメソッドでも同じ

    _displayName = System.IO.Path.GetFileName(account.Value);   //NT AUTHORITY\○○ の ○○部分

  }

  #endregion

 

  #region パブリックプロパティ

  //表示用の名前を取得します。

  public string DisplayName

  {

    get

    {

      return _displayName;

    }

  }

 

  //読み取り可能な名前を取得します。

  public string ReadableName

  {

    get

    {

      return _readableName;

    }

  }

  #endregion

 

  #region パブリックメソッド

  //表示用の名前を返します。

  public override string ToString()

  {

    return this.DisplayName;

  }

  #endregion

}

 

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/13 23:39 by mitchin(mitchin@wankuma.com)

[Azure]第12話

「すべてのローカル物理サーバーを発注する前に消し去りたい。すべての自社サーバールーム、データセンタの全ての自社サーバーを、この手で」
「神様でも何でもいい」
「今日まで物理サーバーと戦ってきたみんなを、希望を信じたインフラエンジニアを、私は泣かせたくない。最後まで笑顔でいてほしい」
「それを邪魔するルールなんて、壊してみせる、変えてみせる」
「これが私の祈り、私の願い」
「さあ!叶えてよ、デプロイ王子!!」

posted @ 2015/02/12 17:03 by 初音 玲

グループのネストしているすべてのメンバーを表示する画面

前に所属しているすべてのグループを表示する画面をサンプルアプリに追加しました。

これはユーザー、グループ、コンピューターの所属するグループは、プロパティを見ても直接所属しているグループしか表示されないので、間接的に所属しているグループも見れると便利だと考えてたからです。

今回はグループから見て、直接のメンバーだけじゃなく間接的なメンバーも表示する画面をサンプルアプリに追加しました。

画面はツリー表示のみです。

左が Windows アプリで右が Web アプリです。(どれもクリックすると新しいウィンドウで拡大図が表示されます。)

AllMembersWin AllMembersWeb

ツリー表示は所属しているすべてのグループを表示する画面と同じで TreeView を使って、ノードの作成はコードで行ってます。Windows アプリは ImageList も使ってます。

呼出し元のグループリスト画面にはボタンを追加し、クリックすると この画面をダイアログ表示するようにしました。

Web アプリの方は JavaScript で表示するようにしたので、directory.js に下記コードを追加しました。

//グループの名前を指定して、すべてのメンバー画面をダイアログ表示します。

function showAllMemberList(groupName) {

  var url = "AllMemberList.aspx?name=" + encodeURIComponent(groupName);

  showModalDialog(url, window, "dialogWidth: 400px; dialogHeight: 400px; resizable; center;");

}

 

表示するテキストについては次のようにしました。

ユーザー => 表示用の名前(姓名:表示用の所属パス/アカウント名)

グループ => 表示用の名前(グループのスコープ:表示用の所属パス)

コンピューター => 表示用の名前(OS SP:役割)

外部のセキュリティ プリンシパル => 表示用の名前(名前)

 

表示用の名前については、外部のセキュリティ プリンシパルは読み取り可能な名前「NT AUTHORITY\○○」 の ○○部分で、それ以外は name 属性の値です。

ForeignSecurityPrincipal

 

.NET のコードは別途書きます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/02/11 19:07 by mitchin(mitchin@wankuma.com)

静岡Developers勉強会の「UnityとBlenderハンズオン第1章」の資料公開

静岡Developers勉強会では、過去に下記の勉強会を行いました。
2010年:「Programming in Haskell」
2011年:「JavaScript: The Good Parts」
2012年:「HTML5&CSS3実践入門」、「GitHubハンズオン」、「node.jsハンズオン」
2013年:「入門 機械学習」
2014年:「実践 コンピュータビジョン」

今年の2015年は上記の勉強会で学んだことを実践し、Shizudev名義のスマホアプリを開発します。
その為、スマホアプリを開発する上で汎用的なツールとしてUnityとBlenderを学ぶことにしました。

2015/02/07(土)に、静岡Developers勉強会 UnityとBlenderハンズオンが行われる島田市地域交流センター歩歩路(ぽぽろ) 第4会議室には8名(新規参加者が4名)が集まりました。
セッションの準備をしていると自分のノートPCのACアダプタを家に忘れたことが気が付きました。
その為、セッション中の1時間過ぎ後にはバッテリーが切れ、たまたま参加者にMBAとVAIOの2台持ちの方がいたため、MBAをスライド専用にお借りしてセッションを進めることが出来ました。
Unity1セッションとBlender2セッションを行う予定でしたが、みな操作が不慣れだったため2セッションで終了時間20分前となってしまい、次回に持ち越しとなりました。もっとも、最後のセッション資料の作成が間に合ってなかったんですけどね。
当日は参加者全員が、UnityのテトリスもどきとBlenderのサイコロを完成させることが出来たのが良かったです。

UnityとBlenderハンズオン第1章 from yaju88

posted @ 2015/02/09 21:48 by やじゅ

[Hardware]主力ノートPCが壊れたので新しくノートPCを選定

予定では、Windows 10の発売に合わせて今年末くらいに刷新する予定だった主力ノートPCが2年の保証期間が過ぎた直後にお亡くなりになりました。

急ぎ次のノートPCを手に入れないと何もできない状態です。

候補は次の8つ。

さて、どれにしようかな。

No Name CPU Memory Storage Price
1 マウスLB-J301X  Core i7 (4th gen) 4GB (+4GB可) HDD500GB(載替可能) \99,800
2 Mac Book Air 13インチ Core i7 (4th gen) 8GB (増設不可) SSD 256GB \142,400
3 Vaio Pro 13 Core i7 (4th gen) 8GB (増設不可) SSD 256GB \162,000
4 LIFEBOOK WS1/T Core i7 (5th gen) 8GB (+8GB可) HDD500GB(載替可能) \168,307
5 Mac Book Pro 13 Retina Core i7 (4th gen) 8GB (増設不可) SSD 256GB \177,600
6 dynabook KIRA V83/PS Core i7 (5th gen) 8GB (増設不可) SSD 256GB \177,660
7 Surface Pro 3 Core i7 (4th gen) 8GB (増設不可) SSD 256GB \177,984
8 ThinkPad X1 Carbon  Core i7 (5th gen) 8GB (増設不可) SSD 256GB \194,400

posted @ 2015/02/08 21:42 by 初音 玲

[Xamarin]OPCはOlympus AIRになります!

テスターに選ばれてHack中のOPCが3/6にOlympus AIRとして製品版発売になったとニュースリリースでました。
http://www.olympus.co.jp/jp/news/2015a/nr150205opcj.jsp

オリンパスさんのサイトでは発売記念キャンペーンの販売予約が始まっています。
https://shop.olympus-imaging.jp/product/select/catcd/2313

なんか、わくわく感が止まらない。

製品発売決まっていないものでもアンテナにピピッときたものを先行して開発できるのは開発者としてすごくうれしい。でも、それが製品発売となるとなんだか更にうれしくなりますね。

posted @ 2015/02/05 15:42 by 初音 玲

[Windows10]Raspberry Pi 2にはWindows 10が乗ります

Windows 10 Coming to Raspberry Pi 2

Windows 10は実装先のハードによって"Industry"、"Mobile"、"Athens"というセットを計画しています。そのほかにEmbedded Compactと.NET Micro Frameworkまで加えてMicrosoftのIoT向けの戦略になってきます。

このあたりはTechEdヨーロッパでも発表されていました。

http://zdnet4.cbsistatic.com/hub/i/r/2015/02/02/e424db0a-c4d3-4644-a368-14b7765e541f/resize/770x578/33329788499901235c6aca88de5b8b4d/athensiot.jpg

今回、Raspberry Pi 2に乗ってくるのは、.NET Micro Frameworkではなく"Athens"=アテネになります。

別のスライドによれば、MobileとAthensはARMかx86に乗るとのこと。そしてAthensの特徴としては

-----
An optimized version of Windows for resource and cost constrained devices with full power of modern application development to run Unversal Apps.

-----

「universal Windows appsを動作させる日宇町がある資源節約型デバイス=小規模デバイス向け」
とあります。つまりXAMLなどのUIが必要な場合はWindows 10 "Athens"、そして、そういったものが必要ない時は.NET Micro Frameworkという棲み分けになっていくと想像します。

また、マイクロソフトはWindowsとWinodws Phoneのように別々のバイナリにするのではなく、1本化しようとしていますので、コア部分は共通になり、そこにデバイスの資源や必要な機能をチョイスして、"Industry"、"Mobile"、"Athens"という3つのモードを提供してくることが推測できます。

なにはともあれ、いままでであれば企業や開発者が「ストアアプリ別にいいかな」と開発を避けていても「Windows 8専用でしょ?デスクトップアプリも動くよね?Windows RTは気にしない」と言ってしまえたかもです。でも、これからは、これだけ世界が広がってくるとUniversal Windows Appsを今すぐ始めた方が楽しいと思うので、作り方知っておいた方がいいよ!と改めてお勧めしたい思うのです。

posted @ 2015/02/05 13:44 by 初音 玲

[Xamarin]moff x TMCN

ハッカソン発祥のmoffと飲み会発祥のTMCNが組み合わさると何か楽しいことができるかもということでコラボ始まりました。

P2030014

 

例えば、moff manとか!

P2030018

 

今後の動きにご期待ください。

何か楽しいことが起こりそうだ!とピピッとメディアの方がいらっしゃったらぜひTMCN事務局までコンタクトください!

posted @ 2015/02/04 0:35 by 初音 玲

データセンター VS 消費電力

2010年ごろに作成したLT用の資料ですが、久しぶりに見たら関連資料として杉田正さんのデータセンターに関する素晴らしいスライドに出会ったので、改めて取り上げてみました。

データセンターVs消費電力 from yaju88
これからのデータセンターが目指す技術(公開用) from Tadashi Sugita

posted @ 2015/02/03 5:30 by やじゅ

MacBookに、Windows 10 Technical Preview をインストールするには?

MacBook (Early 2008 Core2Duo) に、Windows 10 Technical Previewをインストールしようとしたところ、
DVDから立ち上げて新規インストールしようとすると、以下のメッセージが表示され、何も操作できませんでした。

1.
2.
Select CD-ROM Boot Type :

そこで、新規ではなく8.1からのアップグレードでインストールしたところ、うまくいきました。

1. Windows8をインストール
2. Windows Updateで最新にする
3. Windows8.1にアップデート
4. Windows 10 Technical Previewにアップデート

MacBook用のドライバは、こちらからダウンロードできます。MacBook (Early 2008 Core2Duo) には、BootCamp 4のものが使えました。

posted @ 2015/01/29 23:11 by なか-chan@最愛のiMac

近況報告

いつの間にか iPhone アプリ開発者になって早二年。
この記事を書いている Windows 機の脇には Mac Book Pro が居ます。

久しぶりに Windows の開発を行なうと手順が思い出せなくて焦るw

エクスプローラーでファイル名を変更するのに、F2 キーではなく、つい Enter キーを押していたり。
※Mac 標準のキーバインドでは、Finder(Windows のエクスプローラー)では、return でファイル名変更なのです。

一番つらいのは、Mac 版の Excel の動作が Windows 版と互換性がない点かな。
セルの編集が F2 キーではなく、control+U とか、
セル内改行が Alt+Enter ではなく command+control+return だったり。

Windows 機と Mac Book Pro との間でのファイル受け渡しは Bluetooth です。
通信速度は遅いけど、特に何を抜き差ししなくてよいのが最大の利点。
インターネットも要らないし。
Air Drop が使えたら最高なんだけど。

取りあえず生きてます。

posted @ 2015/01/27 0:08 by RAPT

[IoTKitHol]Spider Starter Kitで.NET Micro Framework 4.3を使うには

FEZ Spider Starter Kitを使ってテンプレートのままのプログラムを実行すると配置まではいくのですが実行が空振りでおわってしまいます。

このようなときはFirmwareのバージョンが古いことが考えられます。

USBにFEZ Spider Mainboardを接続してから、PCで

C:\Program Files (x86)\GHI Electronics\GHI FEZ Config\FEZ Config.exe

を起動してファームウェアが最新かを確認してみましょう。

Firmware Update

image

The device’s firmwareのバージョンと、Firmware (TinyCLR) on this computerのバージョンがあっているか確認してください。

あっていないときは[Next]ボタンをクリックするとFirmwareのアップデートが始まります。

1度のアップデートではあげきらない場合もあるのでアップデート後は、再度バージョンを確認してみましょう。

Network Configuration

次にネットワークにMACアドレスが設定されているかも確認しておきましょう。

[Load Built-in Ethernet Config]ボタンをクリックして設定を読み込みます。

図のように[MAC Address]欄に値が入っていればいいのですが、そうでないなら[Generate MAC]ボタンでMACアドレスを生成します。

DISP01-03

それから、[Apply Build-in Ethernet Config]ボタンをクリックして設定します。

 

これで準備完了です。

再度、アプリを実行すれば配置が行われブレイクポイントで一時停止することが確認できます。

posted @ 2015/01/26 12:49 by 初音 玲

2015年最初のLT

24日、.NETラボ勉強会の LT で発表させていただきました。

先週の .NETラボ in 秋田に続いて 2週連続の発表になりました。

今回は先月の LT で発表した「Active Directoryドメインを作ってみよう(その3)」の続きです。

 

既存のドメインにドメインコントローラーを追加した後に DNSサーバーとサイトを設定するという内容です。

 

LT で使ったスライドです。

Active Directoryドメインを作ってみよう ~追加したドメインコントローラーの設定~

Configure DNS(Forwarder) & Sites(Subnets) after adding DC to existing domain.

http://www.slideshare.net/mitchin227/add-dc2

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/01/25 13:13 by mitchin(mitchin@wankuma.com)

Windows 10 TP のEnglish版に日本語パック入れたらまず初めにすること

まず、すぐにシステムロケール変えましょう。

結構気づかずはまります

1、コンパネ起動。

ここは Windows 10らしく、左下の検索画面で「コントロールパネル」と打ちましょうw

image

2、コントロールパネルから、「言語」を選んで左ペインの「日付、時刻、または数値の形式の変更」を選びましょう

管理タブから「システムロケールの変更」を押して、日本語を選んで再起動しましょう

image

posted @ 2015/01/24 12:52 by ちゅき

Windows 10 Preview で日本語化できるよなった幸せ(T_T)

これでもう、ファイル名化けまくりとか、テキストファイルご死亡という悲しい目に合わなくて済む^^

 

Option押して「Download」をクリックすると、いままでは残念!でしたがダウンロード始まりました^^

image

 

まだダウンロード中にも関わらず、日本語が見える。ページの構成もウザいとおもっていたところが変わっていてうれしい^^

・ライブタイルの領域が増えている

・スタートメニューがボタン一発で最大化する!!!

・プログラムの一覧が出しやすくなっている

image

 

 

image

posted @ 2015/01/24 11:29 by ちゅき

[Windows10]Windows 10 Technical Preview 9926がやってきた

Windows 10の2回目のTechnical Previewがやってきましたね。

今度の9926には日本語版も提供されています。

https://msdn.microsoft.com/ja-jp/subscriptions/

image

MSDNサブスクリプションを持っていない場合でも「Windiows Insider Program」に参加するとダウンロードできます。

https://insider.windows.com/

image

 

Windows Insider Programのページ見てみると、さらっと「New Windows 10 Technical Preview for phones」が2月にくるよ!ってかかれていますね。

こちらの方も楽しみです。昨年のde:codeで貰ったlumia 1520とかHTC 8xとかシアトルでかったBLE HDとかどれかでは動かせるのが提供されるとうれしい。

posted @ 2015/01/24 9:53 by 初音 玲

[WiX] WiX 3.9 R2 メンテナンスリリース公開

ネタ元:WiX Toolset v3.9 R2 maintenance release is available

以下の深刻なバグ修正が行われたのでメンテナンスリリースを出すことになったようです。

  • Bug 4600 | VSExtension Help custom action binaries are corrupt.
  • Bug 4608 | Multiple prerequisites return failure, when 1st prerequisite is already installed and 2nd prerequisite is installed successfully.
  • Bug 4609 | Bug in BVariantCopy() in src/burn/engine/variant.cpp

いずれのバグも引っかからない場合はアップデートは不要だそうです。

新規にインストーラを作るときにならない限りは問題なさそうですね。

posted @ 2015/01/23 17:04 by とっちゃん

[Mobile]OLYMPUS OPC Hack & Make Projectに選定されました

http://opc.olympus-imaging.com/

OLYMPUS OPC Hack & Make Projectは、OPC = Open Pratform Camera、SDK (Android / iPhone)、3Dデータをオリンパスさんが提供し、アプリやアクセサリを作成するプロジェクトです。

 

このプロジェクトにTMCNのたけせんさんと会話しながら浮かんだアイデアで応募したら、見事に選定されました。

2015/1/22に渋谷のFabCafeで受領できるようなので楽しみです。

 

もちろん、Android / iOSしかSDKがなくてBluetooth 4.0接続ということなので、なんとかデータ仕様を入手して、Xamarin.Android用SDKやWindowsストアアプリ用SDKを構築したいですね。

posted @ 2015/01/12 10:42 by 初音 玲

.NETラボ in 秋田の資料

17日(土)に .NETラボ in 秋田でセッションさせていただく資料の準備ができたので、公開しました。

 

スライド:所属しているグループをすべて取得する

サンプルアプリ:VB版C#版(ダウンロードは Download のリンクからできます)

 

セッションは主にデモとソースコードをお見せしながらの説明にしようかなと考えてます。

 

お時間ある方はぜひご参加ください。

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/01/11 12:53 by mitchin(mitchin@wankuma.com)

所属しているすべてのグループを表示する画面のWebアプリのコード(C#)

所属しているすべてのグループを表示する画面の Web アプリの C# のコードです。

//プライベートフィールド

private DomainObject member;  //メンバー

private Dictionary<string, DomainGroup> allGroups;  //全グループ(Key:distinguishedName)

private List<string> addedDistinguishedNames;   //リストに追加したグループの識別名

 

//イベントハンドラ

protected void Page_Load(object sender, EventArgs e)

{

  var name = Request.QueryString["name"];   //名前

  if (String.IsNullOrEmpty(name))

  {

    return;

  }

 

  CategoryType category;  //Directory オブジェクトの種類

  if (Enum.TryParse<CategoryType>(Request.QueryString["category"], out category) == false)

  {

    return;

  }

  if (this.IsPostBack)

  {

    return;

  }

 

  switch (category)   //Directory オブジェクトの種類

  {

    case CategoryType.User:

      member = DomainUser.FindByName(name);   //ユーザーを検索

      break;

    case CategoryType.Group:

      member = DomainGroup.FindByName(name);  //グループを検索

      break;

    case CategoryType.Computer:

      member = Computer.FindByName(name);     //コンピューターを検索

      break;

  }

  if (member == null)

  {

    return;

  }

 

  allGroups = DirectoryAccess.GetGroups<DomainGroup>().ToDictionary(

    group => group.Entry.Properties["distinguishedName"].Value.ToString(), group => group);

  addedDistinguishedNames = new List<string>();

  this.AddChildNode();  //子ノードを追加

  this.GroupListBox.DataSource = CreateGroupTable();  //データソース用のテーブルを作成

  this.GroupListBox.DataTextField = "Text";

  this.GroupListBox.DataValueField = "Value";

  if (addedDistinguishedNames.Count > 1)

  {

    this.GroupListBox.Style.Add(HtmlTextWriterStyle.BorderStyle, "None");

  }

  else

  {

    this.ViewRadioButtonList.Enabled = false;

  }

  this..GroupListBox.DataBind();

  member.Dispose();

  DirectoryAccess.DisposeItems(allGroups.Values);

}

 

protected void ViewRadioButtonList_SelectedIndexChanged(object sender, EventArgs e)

{

  this.GroupTreeView.Visible = this.ViewRadioButtonList.SelectedIndex == 0;

  this.GroupListBox.Visible = !this.GroupTreeView.Visible;

}

 

//プライベートメソッド

//子ノードを追加

private void AddChildNode()

{

  var node = new TreeNode(member.ToString(), member.Name);

  this.GroupTreeView.Nodes.Add(node);

  if ((member.Category == CategoryType.User) || (member.Category == CategoryType.Computer))

  {

    //プライマリー グループを追加

    var primaryGroupId = (member.Category == CategoryType.User) ?

      ((DomainUser)member).PrimaryGroupId : ((Computer)member).PrimaryGroupId;

    var group = allGroups.Values.Cast<DomainGroup>().Single(grp => grp.Token == primaryGroupId);

    this.AddChildNode(node, group);   //子ノードを追加

  }

  //所属するグループを追加

  foreach (string memberOf in member.Entry.Properties["memberOf"])

  {

    this.AddChildNode(node, allGroups[memberOf]);   //子ノードを追加

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainGroup group)

{

  var displayName = String.Format("{0}({1})", group.Name, group.Scope);   //表示するテキスト

  var distinguishedName = group.Entry.Properties["distinguishedName"].Value.ToString();   //識別名

  var childNode = new TreeNode(displayName, group.Name);  //ノードを作成

  node.ChildNodes.Add(childNode);

  if (addedDistinguishedNames.Contains(distinguishedName) == false)

  {

    addedDistinguishedNames.Add(distinguishedName);   //識別名を追加

  }

  //ネストしているグループを追加

  foreach (string memberOf in group.Entry.Properties["memberOf"])

  {

    this.AddChildNode(childNode, allGroups[memberOf]);  //子ノードを追加

  }

}

 

//データソース用のテーブルを作成

private DataTable CreateGroupTable()

{

  var table = new DataTable();

  table.Columns.Add(new DataColumn("Value", typeof(string)));   //値(distinguishedName)

  table.Columns.Add(new DataColumn("Text", typeof(string)));    //表示するテキスト

  foreach (var distinguishedName in addedDistinguishedNames)

  {

    var row = table.NewRow();

    var group = allGroups[distinguishedName];

    var displayName = String.Format("{0}({1})", group.Name, group.Scope);

    row[0] = distinguishedName;

    row[1] = displayName;

    table.Rows.Add(row);

  }

  return table;

}

 

内容的には Windows アプリと同じです。説明は VB の方に書いてますのでそちらをご覧ください。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/01/10 3:24 by mitchin(mitchin@wankuma.com)

所属しているすべてのグループを表示する画面のWebアプリのコード(VB)

所属しているすべてのグループを表示する画面の Web アプリの VB のコードです。

'プライベートフィールド

Private member As DomainObject  'メンバー

Private allGroups As Dictionary(Of String, DomainGroup)   '全グループ(Key:distinguishedName)

Private addedDistinguishedNames As List(Of String'ノードに追加したグループの識別名

 

'イベントハンドラ

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

  Dim name = Request.QueryString("name"'名前

  If String.IsNullOrEmpty(name) Then

    Return

  End If

 

  Dim category As CategoryType  'Directory オブジェクトの種類

  If [Enum].TryParse(Of CategoryType)(Request.QueryString("category"), category) = False Then

    Return

  End If

  If Me.IsPostBack Then

    Return

  End If

 

  Select Case category  'Directory オブジェクトの種類

    Case CategoryType.User

      member = DomainUser.FindByName(name)  'ユーザーを検索

    Case CategoryType.Group

      member = DomainGroup.FindByName(name) 'グループを検索

    Case CategoryType.Computer

      member = Computer.FindByName(name)    'コンピューターを検索

  End Select

  If member Is Nothing Then

    Return

  End If

 

  allGroups = DirectoryAccess.GetGroups(Of DomainGroup)().ToDictionary(

    Function(group) group.Entry.Properties.Item("distinguishedName").Value.ToString(), Function(group) group)

  addedDistinguishedNames = New List(Of String)()

  Me.AddChildNode()   '子ノードを追加

  Me.GroupListBox.DataSource = CreateGroupTable()   'データソース用のテーブルを作成

  Me.GroupListBox.DataTextField = "Text"

  Me.GroupListBox.DataValueField = "Value"

  If addedDistinguishedNames.Count > 1 Then

    Me.GroupListBox.Style.Add(HtmlTextWriterStyle.BorderStyle, "None")

  Else

    Me.ViewRadioButtonList.Enabled = False

  End If

  Me.GroupListBox.DataBind()

  member.Dispose()

  DirectoryAccess.DisposeItems(allGroups.Values)

End Sub

 

Protected Sub ViewRadioButtonList_SelectedIndexChanged(

  sender As Object, e As EventArgs) Handles ViewRadioButtonList.SelectedIndexChanged

  Me.GroupTreeView.Visible = (Me.ViewRadioButtonList.SelectedIndex = 0)

  Me.GroupListBox.Visible = Not Me.GroupTreeView.Visible

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode()

  Dim node As New TreeNode(member.ToString(), member.Name)

  Me.GroupTreeView.Nodes.Add(node)

  If (member.Category = CategoryType.User) OrElse (member.Category = CategoryType.Computer) Then

    'プライマリー グループを追加

    Dim primaryGroupId = If(member.Category = CategoryType.User,

      DirectCast(member, DomainUser).PrimaryGroupId, DirectCast(member, Computer).PrimaryGroupId)

    Dim group = allGroups.Values.Cast(Of DomainGroup)().Single(Function(grp) grp.Token = primaryGroupId)

    Me.AddChildNode(node, group)  '子ノードを追加

  End If

  '所属するグループを追加

  For Each memberOf As String In member.Entry.Properties.Item("memberOf")

    Me.AddChildNode(node, allGroups.Item(memberOf))   '子ノードを追加

  Next

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, group As DomainGroup)

  Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)  '表示するテキスト

  Dim distinguishedName = group.Entry.Properties.Item("distinguishedName").Value.ToString()   '識別名

  Dim childNode As New TreeNode(displayName, group.Name)  'ノードを作成

  node.ChildNodes.Add(childNode)

  If addedDistinguishedNames.Contains(distinguishedName) = False Then

    addedDistinguishedNames.Add(distinguishedName)  '識別名を追加

  End If

  'ネストしているグループを追加

  For Each memberOf As String In group.Entry.Properties.Item("memberOf")

    Me.AddChildNode(childNode, allGroups.Item(memberOf))  '子ノードを追加

  Next

End Sub

 

'データソース用のテーブルを作成

Private Function CreateGroupTable() As DataTable

  Dim table As New DataTable()

  table.Columns.Add(New DataColumn("Value", GetType(String)))   '値(distinguishedName)

  table.Columns.Add(New DataColumn("Text", GetType(String)))    '表示するテキスト

  For Each distinguishedName In addedDistinguishedNames   'ノードに追加したグループ数分

    Dim row = table.NewRow()

    Dim group = allGroups.Item(distinguishedName)

    Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)

    row.Item(0) = distinguishedName

    row.Item(1) = displayName

    table.Rows.Add(row)

  Next

  Return table

End Function

 

内容的には Windows アプリと同じです。

メンバー(対象のオブジェクト)の情報は Page.Load イベントで、クエリ文字列から name(名前)と category(Directory オブジェクトの種類)を取得してます。

で、Directory オブジェクトの種類ごとにそのクラスの FindByName メソッドを呼び出してオブジェクトを取得してます。

FindByName メソッドはユーザーグループコンピューターの各リスト画面の詳細表示用 FormView のデータソースになってる ObjectDataSource の SelectMethod に指定されてるメソッドです。

実装コードはこちら(ユーザーグループコンピューター

 

ListBox のデータソースには DataTable をセットしてます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/01/10 3:08 by mitchin(mitchin@wankuma.com)

所属しているすべてのグループを表示する画面のWindowsアプリのコード(C#)

所属しているすべてのグループを表示する画面の Windows アプリの C# のコードです。

//プライベートフィールド

private readonly DomainObject member;   //メンバー

private readonly Dictionary<string, DomainGroup> allGroups;   //全グループ(Key:distinguishedName)

private readonly List<string> addedDisplayNames;  //リストに追加したグループの表示テキスト

 

//パブリックコンストラクター

public InRoleGroupList(DomainObject member)

{

  InitializeComponent();

  this.member = member;

  allGroups = DirectoryAccess.GetGroups<DomainGroup>().ToDictionary(

    group => group.Entry.Properties["distinguishedName"].Value.ToString(), group => group);

  addedDisplayNames = new List<string>();

  this.AddChildNode();  //子ノードを追加

  this.GroupListBox.DataSource = addedDisplayNames;

  this.ViewPanel.Enabled = addedDisplayNames.Count > 1;

  this.GroupTreeView.ExpandAll();

}

 

//イベントハンドラ

//TreeRadioButton, ListRadioButton

private void RadioButton_CheckedChanged(object sender, EventArgs e)

{

  this.GroupTreeView.Visible = sender == this.TreeRadioButton;

  this.GroupListBox.Visible = !this.GroupTreeView.Visible;

}

 

//プライベートメソッド

//子ノードを追加

private void AddChildNode()

{

  var imageIndex = (int)member.Category;

  var node = new TreeNode(member.ToString(), imageIndex, imageIndex);

  this.GroupTreeView.Nodes.Add(node);

  if ((member.Category == CategoryType.User) || (member.Category == CategoryType.Computer))

  {

    //プライマリー グループを追加

    var primaryGroupId = (member.Category == CategoryType.User) ?

      ((DomainUser)member).PrimaryGroupId : ((Computer)member).PrimaryGroupId;

    var group = allGroups.Values.Cast<DomainGroup>().Single(grp => grp.Token == primaryGroupId);

    this.AddChildNode(node, group);   //子ノードを追加

  }

  //所属するグループを追加

  foreach (string memberOf in member.Entry.Properties["memberOf"])

  {

    this.AddChildNode(node, allGroups[memberOf]);   //子ノードを追加

  }

}

 

//子ノードを追加

private void AddChildNode(TreeNode node, DomainGroup group)

{

  var childNode = CreateNode(group);  //ノードを作成

  node.Nodes.Add(childNode);

  if (addedDisplayNames.Contains(childNode.Text) == false)

  {

    addedDisplayNames.Add(childNode.Text);  //表示するテキストを追加

  }

  //ネストしているグループを追加

  foreach (string memberOf in group.Entry.Properties["memberOf"])

  {

    this.AddChildNode(childNode, allGroups[memberOf]);  //子ノードを追加

  }

}

 

//指定したグループのノードを作成

private TreeNode CreateNode(DomainGroup group)

{

  var displayName = String.Format("{0}({1})", group.Name, group.Scope);   //表示するテキスト

  var fontColor = Color.Black;

  switch (group.ScopeType)

  {

    case DomainGroupScopeType.DomainLocal:

      fontColor = Color.Blue;

      break;

    case DomainGroupScopeType.Global:

      fontColor = Color.Green;

      break;

    case DomainGroupScopeType.Universal:

      fontColor = Color.Brown;

      break;

  }

  return new TreeNode(displayName) { Name = group.Name, ForeColor = fontColor };

}

 

Dispose メソッドに次のコードを追加しました。

DirectoryAccess.DisposeItems(allGroups.Values);

 

内容の説明は VB の方に書いてますのでそちらをご覧ください。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/01/08 22:06 by mitchin(mitchin@wankuma.com)

[Codezine]Salesforce + WPFアプリの解説がCodezineに掲載されました

http://codezine.jp/article/detail/8400

--

 ハイブリッドクラウドにおける接続を解決するアプローチはいろいろありますが、ADO.NETによるさまざまなデータソースとの接続性を活用するというアプローチに注目したのが、今回使用する「CData ADO.NET Provider for Salesforce 4J」です。

 CData ADO.NET Provider for Salesforce 4J(以下、CData)を使えば、ADO.NETでのノウハウを使ってSalesforceからデータを取得できます。さらに、ADO.NETでの接続を前提とした各種コントロールのデータソースとしてSalesforceを指定することもできるのです。

 なお、今回のサンプルはVisual Studio Ultimate 2013で作成しましたが、無料版であるVisual Studio Community 2013でも同じ手順で確認することができます。

--

 

Salesforceをデータソースとして使うコントロールの紹介になります。

ぜひ、ご覧下さい。

posted @ 2015/01/08 21:23 by 初音 玲

[Azure]Developers Summit 2015のセンサー&デバイス枠の中で登壇します。

2015/02/19(木)にDevelopers Summit 2015に登壇します。

----

【19-A-7】センサー&デバイス大集合
http://event.shoeisha.jp/devsumi/20150219/session/640

『センサー&クラウドを体験しよう』 初音 玲〔TMCN〕氏
各種センサーおよびデバイスからのデータをMicrosoft Azureで収集して可視化するための勘所を実演を中心にご紹介します。

----

私の他にも一緒に登壇する方が紹介する内容は面白い物ばかりなのでぜひ目黒雅叙園にきてください!

 

posted @ 2015/01/08 17:25 by 初音 玲

所属しているすべてのグループを表示する画面のWindowsアプリのコード(VB)

所属しているすべてのグループを表示する画面の Windows アプリの VB のコードです。

'プライベートフィールド

Private ReadOnly member As DomainObject   'メンバー

Private ReadOnly allGroups As Dictionary(Of String, DomainGroup'全グループ(Key:distinguishedName)

Private ReadOnly addedDisplayNames As List(Of String)   'リストに追加したグループの表示テキスト

 

'パブリックコンストラクター

Public Sub New(member As DomainObject)

  InitializeComponent()

  Me.member = member

  allGroups = DirectoryAccess.GetGroups(Of DomainGroup)().ToDictionary(

    Function(group) group.Entry.Properties.Item("distinguishedName").Value.ToString(), Function(group) group)

  addedDisplayNames = New List(Of String)()

  Me.AddChildNode()   '子ノードを追加

  Me.GroupListBox.DataSource = addedDisplayNames

  Me.ViewPanel.Enabled = addedDisplayNames.Count > 1

  Me.GroupTreeView.ExpandAll()

End Sub

 

'イベントハンドラ

Private Sub RadioButton_CheckedChanged(

  sender As Object, e As EventArgs) Handles TreeRadioButton.CheckedChanged, ListRadioButton.CheckedChanged

  Me.GroupTreeView.Visible = sender Is Me.TreeRadioButton

  Me.GroupListBox.Visible = Not Me.GroupTreeView.Visible

End Sub

 

'プライベートメソッド

'子ノードを追加

Private Sub AddChildNode()

  Dim node As New TreeNode(member.ToString(), member.Category, member.Category)

  Me.GroupTreeView.Nodes.Add(node)

  If (member.Category = CategoryType.User) OrElse (member.Category = CategoryType.Computer) Then

    'プライマリー グループを追加

    Dim primaryGroupId = If(member.Category = CategoryType.User,

      DirectCast(member, DomainUser).PrimaryGroupId, DirectCast(member, Computer).PrimaryGroupId)

    Dim group = allGroups.Values.Cast(Of DomainGroup)().Single(Function(grp) grp.Token = primaryGroupId)

    Me.AddChildNode(node, group)  '子ノードを追加

  End If

  '所属するグループを追加

  For Each memberOf As String In member.Entry.Properties.Item("memberOf")

    Me.AddChildNode(node, allGroups.Item(memberOf))   '子ノードを追加

  Next

End Sub

 

'子ノードを追加

Private Sub AddChildNode(node As TreeNode, group As DomainGroup)

  Dim childNode = CreateNode(group)   'ノードを作成

  node.Nodes.Add(childNode)

  If addedDisplayNames.Contains(childNode.Text) = False Then

    addedDisplayNames.Add(childNode.Text)   '表示するテキストを追加

  End If

  'ネストしているグループを追加

  For Each memberOf As String In group.Entry.Properties.Item("memberOf")

    Me.AddChildNode(childNode, allGroups.Item(memberOf))  '子ノードを追加

  Next

End Sub

 

'指定したグループのノードを作成

Private Function CreateNode(group As DomainGroup) As TreeNode

  Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)  '表示するテキスト

  Dim fontColor As Color

  Select Case group.ScopeType

    Case DomainGroupScopeType.DomainLocal

      fontColor = Color.Blue

    Case DomainGroupScopeType.Global

      fontColor = Color.Green

    Case DomainGroupScopeType.Universal

      fontColor = Color.Brown

  End Select

  Return New TreeNode(displayName) With {.Name = group.Name, .ForeColor = fontColor}

End Function

 

Dispose メソッドに次のコードを追加しました。

DirectoryAccess.DisposeItems(allGroups.Values)

 

コンストラクターで受け取っているメンバーは、呼出し元のリスト画面で選択されたオブジェクトで、ユーザー、グループまたはコンピューターです。

そのメンバーの所属するグループを再帰的に取得してます。

所属するグループはその都度検索して取得するのではなく、事前にすべてのグループを取得して、取り出しやすいよう distinguishedName 属性(識別名)の値をキーにした Dictionary から取得するようにしました。

ドメインの規模が大きい場合はその都度検索した方がいいかもしれないですね。

DirectoryAccess.GetGroups メソッドの実装は CodePlex の方をご覧ください。

 

所属するグループは memberOf 属性で取得できるので、For Each で回して取得してます。

例えば Administrator だと distinguishedName 属性と memberOf 属性の値は次のようになります。

distinguishedName 属性の値

CN=Administrator,CN=Users,DC=proceed,DC=pbyk,DC=com

memberOf 属性の値

CN=Group Policy Creator Owners,CN=Users,DC=proceed,DC=pbyk,DC=com

CN=Domain Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

CN=Enterprise Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

CN=Schema Admins,CN=Users,DC=proceed,DC=pbyk,DC=com

CN=Administrators,CN=Builtin,DC=proceed,DC=pbyk,DC=com

 

見ての通り書式が同じなので、memberOf 属性の値をキーにして Dictionary から所属するグループのオブジェクトを取り出してます。

あと、ユーザーとコンピューターはプライマリー グループがあり、これは memberOf 属性に含まれないので別途取得してます。

取得は簡単で、ユーザーやコンピューターの primaryGroupID 属性の値(PrimaryGroupId プロパティに保持)= グループの primaryGroupToken 属性の値(Token プロパティに保持)であるグループを Dictionary から検索してます。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html

posted @ 2015/01/06 20:16 by mitchin(mitchin@wankuma.com)