Shizuku Blog ~ techbank.jp版~

~女性エンジニア けろ-みおの苦悩~

ログイン | ID登録 | ヘルプ


ニュース

techbank.jp 著作本は如何でしょうか?

このBlog記事で
不明点がある場合は、
techbank.jp掲示板
でお問い合わせ頂くか、
直接Blogにコメント
頂ければと思います。

♪ 自己紹介
けろ-みおと申します。この「techbank.jp」の管理人をやっております。どうぞ気軽にコメント・質問下さい。コメントや質問は、techbank.jp IDを登録したのち、専用掲示板もしくは、Blogにコメント頂くと便利です。


MVP Profile
Microsoft MVP for ASP/ASP.NET

けろ-みおの関連サイト





このBlogの人気度
フィードメーター - techbank.jpコミュニティ

techbank.jp Blog全体と近いBlog
あわせて読みたいブログパーツ

このBlogと近いBlog
あわせて読みたいブログパーツ

Blog購読者数
スカウター : techbank.jp








ZDNet Japan に第6回目となる、私のインタビュー記事が掲載されました。

■Windows 7導入:最大のメリットは「管理の合理化」

http://japan.zdnet.com/extra/windows7_panel_200912/story/0,3800102051,20409168-4,00.htm

 

話の趣旨としては、

 

「【識者に聞く】Windows 7 と Windows Server 2008 R2 の組み合わせで何を実現したいですか?」

 

というテーマで、私なりに今後やりたいことをそのまま書いてみました。

今回で最終回なので、できれば記事の方にコメントして欲しいです。

コメントすると抽選でAmazon商品券 5000円が手に入るんですよ! 是非お願いします。

ちなみに最終回だからちゃんと書こうと思っていたら、短めに終わっちゃいましたw

ダラダラ書くよりはマシですが、本来自分の専門分野じゃないところで書かせて頂いたので、

結構苦労したというのが率直な感想です。

野良さんみたいに、某レポートを綺麗に書ける実力が欲しいです。

 

いずれにしても、これで別件の執筆作業に打ち込めることは間違いないので、

気持ちを切り替えて明日からまた頑張ります。

Posted けろ-みお | no comments
分類:

 

プログラミング言語論やアルゴリズムに元々興味がなかった(動けばそれで良いと思っていたダメタイプ)ので、

今まで知らなかったのですが、BitVector32とBitArrayが示す、

TrueとFalseの整数フラグ値と処理速度に違いがあることを知りました。

 

C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;

namespace ConsoleApplication1
{
    [Flags]
    public enum BitFlag
    {
        TrueIndex = 0x00,
        FalseIndex = 0x01
    }

    class Program
    {

        static void Main(string[] args)
        {
            // BitVector32は、trueが-1, falseが0
            Console.WriteLine("BitVector32の-1: {0}", new BitVector32(-1)[(int)BitFlag.TrueIndex]);
            Console.WriteLine("BitVector32の 0: {0}", new BitVector32(0)[(int)BitFlag.FalseIndex]);

            // BitArrayの定義
            BitArray b = new BitArray(2);

            // BitArrayは、Trueが1、Falseが0
            b[(int)BitFlag.TrueIndex] = true;
            b[(int)BitFlag.FalseIndex] = false;

            Console.WriteLine("BitArrayのTrue:{0}", Convert.ToInt16(b[(int)BitFlag.TrueIndex]));
            Console.WriteLine("BitArrayのFalse:{0}", Convert.ToInt16(b[(int)BitFlag.FalseIndex]));
        }
    }
}

Visual Basic

Imports System.Collections.Specialized

Module Module1

    <Flags()> _
    Public Enum BitFlag
        TrueIndex = &H0
        FalseIndex = &H1
    End Enum

    Sub Main()

        ' BitVector32は、trueが-1, falseが0
        Console.WriteLine("BitVector32の-1: {0}", New BitVector32(-1).Item(BitFlag.TrueIndex))
        Console.WriteLine("BitVector32の 0: {0}", New BitVector32(0).Item(BitFlag.FalseIndex))

        ' BitArrayの定義
        Dim b As New BitArray(2)

        ' BitArrayは、Trueが1、Falseが0
        b.Item(BitFlag.TrueIndex) = True
        b.Item(BitFlag.FalseIndex) = False

        Console.WriteLine("BitArrayのTrue:{0}", Convert.ToInt16(b.Item(BitFlag.TrueIndex)))
        Console.WriteLine("BitArrayのFalse:{0}", Convert.ToInt16(b.Item(BitFlag.FalseIndex)))

    End Sub

End Module

 

実行結果

image

 

まとめると、

   BitVector32  BitArray
true  -1 を表す  1 を表す
false  0 を表す  0 を表す

となります。

 

それでは、BitVector32 と BitArray どっちが良いの?という話になりますが、実装したい処理によっても異なるみたいです。

値の小さいフラグ値を使用する場合は、BitVector32の方が、BitArrayに比べてオーバーヘッドが少なくて、パフォーマンスも良いみたいです。

理由としては、32ビット分しか格納しないからとMSDNに書いてありましたが、どうなんでしょうね。

http://msdn.microsoft.com/ja-jp/library/system.collections.specialized.bitvector32%28VS.80%29.aspx

一方、BitArrayは必要に応じてサイズを決定できるので、大きいサイズのデータを格納するのには向いているというところでしょうか。

ちょっとスピードを測定してみましょうか。下記のようなコードを書いて、1万回と10万回で検証してみました。

 

C#

public static void DoBitVector32()
{

    DateTime startTime = DateTime.Now;

    for(int i = 0; i<=100000; i++)
    {
        var a = new { trueValue = new BitVector32(-1), falseValue = new BitVector32(0) };
    }

    DateTime endTime = DateTime.Now;
    Debug.WriteLine("DoBitVector32: " + endTime.Subtract(startTime).TotalMilliseconds.ToString() + "ms");
}

public static void DoBitArray()
{

    DateTime startTime = DateTime.Now;

    for(int i = 0; i<=100000; i++)
    {
        var a = new { trueValue = new BitArray(1)[0] = true, falseValue = new BitArray(1)[0] = false };
    }

    DateTime endTime = DateTime.Now;
    Debug.WriteLine("DoBitArray: " + endTime.Subtract(startTime).TotalMilliseconds.ToString() + "ms");

}

 

Visual Basic

Public Shared Sub DoBitVector32()

    Dim startTime As Date = DateTime.Now

    For i As Integer = 0 To 100000
        Dim a = New With {.true = New BitVector32(-1), .false = New BitVector32(0)}
    Next i

    Dim endTime As Date = DateTime.Now
    Debug.WriteLine("DoBitVector32: " & endTime.Subtract(startTime).TotalMilliseconds.ToString() & "ms")

End Sub

Private Shared Sub DoBitArray()

    Dim startTime As Date = DateTime.Now

    For i As Integer = 0 To 100000
        Dim a = New With {.true = New BitArray(1).Item(0) = True, .false = New BitArray(1).Item(0) = False}
    Next i

    Dim endTime As Date = DateTime.Now
    Debug.WriteLine("DoBitArray: " & endTime.Subtract(startTime).TotalMilliseconds.ToString() & "ms")

End Sub

 

結果:

  BitVector32 の結果  BitArray の結果
10,000回  1.0001ms  2.0001ms
100,000回  4.0002ms  16.0009ms

 

プロセッサやメモリによる違いもあるかもしれませんが、10,000回で約2倍、100,000回で約4倍近く違うんですね。

単純なビットフラグ操作なら、BitArrayではなく、BitVector32を使った方が良いみたいですね。

 

プログラムなんて、動けばなんだって良いといういい加減な考えを改めさせて頂きます。

他のtechbank.jp Bloggerさんが紹介しているプログラミング言語表現方法や理論・基礎を見て、もっと勉強させて頂きます。

(特にGushwellさんやgsf_zero1さん、HIROさんのBlogは大事ですね。ソリューションばかりに目が行っていたので反省です orz)

 

某所でこんな質問を承りました。

 

「ADO時代のように構造体を放り込んでループしながらデータ操作できないんですか?

かつてのADOのにあったrs.open rs.addnew rs.edit rs.update rs.close

のような、SQLを使わない方法でテーブルに対しての操作は不可能なのでしょうか?」

 

この質問を某所でソースコード付きで回答すると、投稿が消されてしまうみたいなので、Blogで回答したいと思います。

条件としては、Visual Studio 2008 Express と SQL Server 2008 Express を使用しているとのことなので、

今回は、.NET 初心者の方でもわかる方法でご紹介したいと思います。

 

ちなみに質問の主に対し、私は

「DataSetやDataTableを使えば、ADO(ADO.NET前)と似たようなことはできますが、

DataSetやDataTableにデータを格納するにはCommandTextでSQLもしくはストアド名を設定し、

(DataAdapterを使って)Fillする必要があるので、結局はCommandTextを設定する必要があります。

なので、ADO.NET をADOやDAOと同じように考えない方が良いです。」

と伝えてあります。

ただ、ストアドにできない理由をもっていらっしゃったり、(保守性や開発者のレベルの問題ですが)

また、列数の多いSQLの組み立てをできるだけ簡略化したいというお気持ちはわからなくもないので、

Reflectionを有効活用したSQLの組み立てであれば、そんなに苦になりませんよということを

.NET 初心者向けにご紹介させて頂きます。

 

なお今回紹介する方法は、インジェクションの問題があるので、個人的にはあまりお勧めしたくない実装方法ですが、

実は、techbank.jpの主要コンテンツでデータ操作するところは今回紹介する方法で作られている・・・という恥ずかしいお話でもあります orz

理想はストアドをSQL Server 内に作成し、CommandTextにストアド名、Parameterには、SqlParameterのインスタンスを

渡す作りにする、もしくは、ADO.NET Entity を活用して頂きたいというのが私個人の意見ですが、

ADO.NET Entity に対し敷居が高いと感じられたり、あるいは、データベースのテーブル構成上の問題であったり、

旧システムの諸事情でいろいろと問題があって・・・とかあると思うので、今更なんで?系のやり方で

ご紹介させて頂くことをお許しください。

 

techbank.jp のサイト自体はC#で作成しているんですが、今回、スレ主さんはVBを使っているとのことなので、

更新ロック処理等を細かい処理を省き、VBでコンバートしたもので紹介します。

 

手順1:レコードとなるEntityクラスを作成する。ADO.NET Entity のデザイナを使ってEntity作成を楽にしてもOKです。

Imports System.ComponentModel

Public Class RecordEntity
    Implements INotifyPropertyChanged, ICloneable

    Private Shared _EmptyChangingEventArgs As New PropertyChangingEventArgs(String.Empty)
    Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) _
                 Implements INotifyPropertyChanged.PropertyChanged

    Private _Field0 As Integer
    Private _Field1 As Integer
    Private _Field2 As String
    Private _Field3 As Nullable(Of Decimal)

    Public Property Field0 As Integer
        Get
            Return Me._Field0
        End Get
        Set(ByVal value As Integer)
            Me._Field0 = value
            Me.SendPropertyChanged("Field0")
        End Set
    End Property

    Public Property Field1 As Integer
        Get
            Return Me._Field1
        End Get
        Set(ByVal value As Integer)
            Me._Field1 = value
            Me.SendPropertyChanged("Field1")
        End Set
    End Property

    Public Property Field2 As String
        Get
            Return Me._Field2
        End Get
        Set(ByVal value As String)
            Me._Field2 = value
            Me.SendPropertyChanged("Field2")
        End Set
    End Property

    Public Property Field3 As Nullable(Of Decimal)
        Get
            Return Me._Field3
        End Get
        Set(ByVal value As Nullable(Of Decimal))
            Me._Field3 = value
            Me.SendPropertyChanged("Field3")
        End Set
    End Property

    'プロパティ変更後イベント発行    
    Protected Overridable Sub SendPropertyChanged(ByVal propertyName As String)
        If Me.PropertyChangedEvent IsNot Nothing Then
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
        End If
    End Sub

    ' Clone    
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return Me.MemberwiseClone
    End Function

End Class

 

手順2:SQL構文と更新値、条件値が格納されたSqlInfoという構造体を定義します(構造体じゃなくてもクラスでもOKです)。

 

Imports System.Data.SqlClient

Structure SqlInfo
    Dim sqlString As String
    Dim sqlParams As List(Of SqlParameter)
End Structure

 

手順3:SqlBuilderというクラスを作成する

Imports System.Text
Imports System.Transactions
Imports System.Data.SqlClient
Imports System.Reflection

Public Class SqlBulider(Of T)

    Public Sub Execute(ByVal keyNames As List(Of String), ByVal record As T)

        ' SQL文と主キーや更新値パラメーターを一括生成
        Dim sqlInfo As SqlInfo = Me.CreateUpdateSql(record, keyNames)

        ' SQL Serverデータ更新
        Dim tranOption As New TransactionOptions()
        tranOption.IsolationLevel = Transactions.IsolationLevel.ReadCommitted
        tranOption.Timeout = New TimeSpan(0, 1, 0)

        Using tran As New TransactionScope(TransactionScopeOption.RequiresNew, tranOption)

            Using conn As New SqlConnection("Data Source=ServerName\SQLServerInstanceName;Initial Catalog=DBName;Persist Security Info=True;User ID=UserId;Password=P@ssword;")

                conn.Open()

                ' SQL実行
                Using command As New SqlCommand(String.Empty, conn)

                    ' SQLの設定
                    command.CommandText = sqlInfo.sqlString

                    ' Parameter
                    If sqlInfo.sqlParams IsNot Nothing Then
                        command.Parameters.AddRange(sqlInfo.sqlParams.ToArray())
                    End If

                    ' 更新実行
                    command.ExecuteNonQuery()

                End Using

                conn.Close()

            End Using

            ' コミット
            tran.Complete()

        End Using

    End Sub


    ' エンティティからSQLを生成するメソッド
    Private Function CreateUpdateSql(ByVal param As T, ByVal keyNames As List(Of String)) As SqlInfo

        ' 戻り値
        Dim returnSqlInfo As New SqlInfo
        returnSqlInfo.sqlParams = New List(Of SqlParameter)

        ' SQL文字列
        Dim sql As New StringBuilder()
        Dim keySql As New List(Of String)

        ' RecordEntityの型を取得 
        Dim recordType As Type = GetType(T)

        ' RecordEntityで定義されているすべてのPublicプロパティ定義を取得
        Dim recordPropertyInfo As PropertyInfo() = recordType.GetProperties((BindingFlags.Public Or BindingFlags.Instance))

        ' SQL組み立て開始
        sql.AppendFormat("UPDATE {0} SET ", GetType(T).ToString().Split(".").Last())

        Dim fieldSQL As New List(Of String)

        ' RecordEntityのすべての列に対してSQL文字列をセット
        For Each recField As PropertyInfo In recordPropertyInfo

            Dim currentFieldName As String = recField.Name.ToString()
            Dim currentParamName As String = String.Concat("@", currentFieldName)
            Dim currentSqlParam As SqlParameter
            Dim isKey As Boolean = False

            ' キーがあり、現在処理している列名が主キー(更新キー)の場合
            ' (Existsで使っているPredicateデリゲートを匿名メソッド&ラムダ式で実装してます)
            If keyNames IsNot Nothing AndAlso keyNames.Count > 0 AndAlso _
               keyNames.Exists(Function(value As String) If(currentFieldName.ToUpper() = value.ToUpper, True, False)) Then

                isKey = True

            End If

            ' SQL文
            If isKey Then
                keySql.Add(String.Format("{0} = {1}", currentFieldName, currentParamName))
            Else
                fieldSQL.Add(String.Format("{0} = {1}", currentFieldName, currentParamName))
            End If

            ' Field Type(int, nvarchar etc...)
            Select Case recField.PropertyType

                Case GetType(Nullable(Of Decimal))

                    Dim fieldValue As Nullable(Of Decimal) = recField.GetValue(param, Nothing)

                    ' SQLパラメータ
                    currentSqlParam = New SqlParameter(currentParamName, SqlDbType.Decimal)
                    currentSqlParam.Value = IIf(fieldValue.HasValue, fieldValue.Value, DBNull.Value)
                    returnSqlInfo.sqlParams.Add(currentSqlParam)

                Case GetType(String)

                    ' SQLパラメータ
                    currentSqlParam = New SqlParameter(currentParamName, SqlDbType.NVarChar)
                    currentSqlParam.Value = recField.GetValue(param, Nothing)
                    returnSqlInfo.sqlParams.Add(currentSqlParam)

                Case GetType(Integer)

                    ' SQLパラメータ
                    currentSqlParam = New SqlParameter(currentParamName, SqlDbType.Int)
                    currentSqlParam.Value = recField.GetValue(param, Nothing)
                    returnSqlInfo.sqlParams.Add(currentSqlParam)

                    ' TODO:他にも別の型があればCase文を用いて型別にSQLやパラメータを設定する

                Case Else

                    ' SQLパラメータ
                    currentSqlParam = New SqlParameter(currentParamName, SqlDbType.VarChar)
                    currentSqlParam.Value = recField.GetValue(param, Nothing)
                    returnSqlInfo.sqlParams.Add(currentSqlParam)

            End Select

        Next

        sql.Append(String.Join(",", fieldSQL.ToArray()))
        sql.AppendLine(" WHERE ")
        sql.AppendLine(String.Join(" AND ", keySql.ToArray()))

        ' SQLの設定
        returnSqlInfo.sqlString = sql.ToString()

        Return returnSqlInfo

    End Function

End Class

 

手順4:呼び出し側を実装する。

この時、更新対象となるEntityの型をSqlBuilderクラスのインスタンス作成時に渡すことをお忘れなく

Module Module1

    Sub Main()

        ' 更新キー(主キー)の設定
        Dim keyNames As New List(Of String)
        keyNames.AddRange(New String() {"field0"})

        ' 対象データ
        Dim recordInstance As New RecordEntity

        ' Withは使わない方が良いんですが、説明のため使用しています
        With recordInstance
            .Field0 = 1
            .Field1 = 100
            .Field2 = "Hoge Hoge"
            .Field3 = 10.13
        End With

        ' SQL Update実行
        Dim updateSql As New SqlBulider(Of RecordEntity)
        updateSql.Execute(keyNames, recordInstance)

    End Sub

End Module

 

おおげさな実装に見えるかもしれませんが、列数が多いSQLを動的に組み立てて処理するのには意外と使えるんですよ。

今回はUPDATE文の例で紹介しましたが応用でINSERTやSELECT、DELETEとかもできるので、

是非エンティティとReflectionの活用をご検討頂ければなと思います。

ADOやDAOが主流だった時代のように、SQLなしでメソッド一本で実装できれば、こんな大げさにしなくて済むという

質問者の気持ちもわからなくもないと思った、今日この頃でした。。。

Posted けろ-みお | no comments
分類:


ZDNet Japan に第5回目となる、私のインタビュー記事が掲載されました。

■バラバラのデータ授受をBranchCacheで一本化できると期待

http://japan.zdnet.com/extra/windows7_panel_200912/story/0,3800102051,20407839-5,00.htm

 

話の趣旨としては、

 

「【識者に聞く】データの効率的な受け渡しと生産性の向上にBranchCacheは効くか?」

 

というお題の中で、Windows 7 や Windows Server 2008 R2 に搭載された
「BranchCache」について自論を展開しています。

実は、自宅でBranchCacheを試したんですが、ちょっと違うなぁと思う印象がありました。
インデックスとどのように連携取っているのか?についても相当謎です。

なお、上記記事に対して、意見を寄せてくれた読者の中から毎回1名様に、
Amazon商品券5,000円分 をプレゼント してくれるそうなので、
是非是非、記事にご意見をお寄せ下さいませ。 
(私をはじめとする識者の意見が違うよ等あれば、遠慮なくご指摘くださいませ)
(あまりにもコメントする方が少ないので、ちょっと盛り上げて欲しいです。野良さん1人が頑張ってる感じですw
野良さんに全額商品券持って行かせないためにも、ご協力よろしくお願いしますw)

それから、私以外にも9名の識者が登場しておりますので、他の識者の記事も併せてご覧いただけると有難いです。

他識者のご意見・経験談(第五回目用):
http://japan.zdnet.com/extra/windows7_panel_200912/story/0,3800102051,20407839,00.htm

次回(第6回目)のお題はまだ頂いてませんが、来週から怒涛のMCP受験ラッシュ(MCTSの2試験とMBMSと4試験)なので、 
しばらくの間はお題を振らないで~ って感じですw
いずれにしても次回が最終回になるような気がしてますので、最後くらいはきちんとしたものを書きたいです。

どうぞ宜しくお願いします。s


例えばこんな画面をユーザーコントロール(ascx) で作成したとします。

image 

実はこの画面、ITemplete 型のプロパティとTemplateContainer属性を使用し、
独自でユーザーコントロールを作成した画面になります。
(GridViewやFormView等の標準コントロールは使用しなかった画面です)

もしこのようなユーザーコントロールを画面に張り付けた際、下記のような警告が出てしまった場合の
対処方法を簡単にご紹介します。

image

警告:「要素 ‘ControlName’ に対しては、開始タグと終了タグの間でコンテンツを使用できません」


一番手っとい早い解決策(警告を消す方法)としては、ITemplete型のプロパティを定義している
ユーザーコントロールの属性に、PersistenceMode属性を付与すると警告を消すことができます。
(Visual Studio 2010 Beta2での話ですが。他のバージョンでは確認してませんのであしからず)

■ ProductControl.ascx.vb

Imports System.ComponentModel
Imports System.Web.UI.Design

Public Class TemplateControl
    Inherits System.Web.UI.UserControl

    ''' <summary>
    ''' TemplateContainerAttribute(TemplateContainer属性)が付与された
    ''' ITemplate型のプロパティを宣言する
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <TemplateContainer(GetType(ProductContainer))> _
    <PersistenceMode(PersistenceMode.InnerProperty)> _
    Public Property ProductTemplate As ITemplate


    Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

        ' Templateを格納するPlaceHolderコントロールを定義
        Dim ph As New PlaceHolder

        ' Templateにインスタンスが割り当てられてない場合
        If ProductTemplate Is Nothing Then
            Exit Sub
        End If

        ' コンテナのインスタンスを生成する
        Dim containers As New List(Of ProductContainer)
        containers.Add(New ProductContainer(1, "炊飯ジャー", 2000))
        containers.Add(New ProductContainer(2, "電子レンジ", 1500))
        containers.Add(New ProductContainer(3, "冷蔵庫", 40000))
        containers.Add(New ProductContainer(4, "テレビ", 35000))
        containers.Add(New ProductContainer(5, "エアコン", 24000))

        ' TemplateとPlaceHolderコントロールに、生成したコンテナのインスタンス(Templateの中身)を割り当てる
        For Each containerItem As ProductContainer In containers
            ProductTemplate.InstantiateIn(containerItem)
            ph.Controls.Add(containerItem)
            ph.Controls.Add(New LiteralControl("<hr />"))
        Next

        ' PlaceHolderをユーザコントロールに追加する
        Me.Controls.Add(ph)

    End Sub

End Class

 

■ITempleteで使用するコンテナ(INamingContainer) のクラス

Imports System.ComponentModel

''' <summary>
''' 名前付きコンテナ(入れ物)を定義する
''' </summary>
''' <remarks></remarks>
Public Class ProductContainer
    Inherits Control
    Implements INamingContainer

    <Bindable(True), Category("データ"), Description("商品番号")> _
    Public Property [商品番号] As Integer

    <Bindable(True), Category("データ"), DefaultValue(""), Description("商品名")> _
    Public Property [商品名] As String

    <Bindable(True), Category("データ"), Description("エコポイント")> _
    Public Property [エコポイント] As Single


    Public Sub New(ByVal [商品番号] As Integer, ByVal [商品名] As String, ByVal [エコポイント] As Single)
        Me.商品番号 = [商品番号]
        Me.商品名 = [商品名]
        Me.エコポイント = エコポイント
    End Sub

End Class


ちなみに、上記ユーザーコントロールを配置したPage(aspx)は、こんな感じです。
    <uc1:ProductControl ID="ProductControl1" runat="server">
        <ProductTemplate>
            <asp:TextBox ID="ProductNo" runat="server" Text="<%# Container.商品番号 %>" />
            <asp:TextBox ID="TextBox1" runat="server" Text="<%# Container.商品名 %>" />
            <asp:TextBox ID="TextBox2" runat="server" Text="<%# Container.エコポイント %>" />
        </ProductTemplate>
    </uc1:ProductControl>

ITempleteやINamingContainerを使って日頃からカスタムコントロールまたはユーザーコントロールを
作り続けている人にとっては当たり前の話なのかもしれませんが、
私は、この辺りがちょっと苦手でして・・・
いつもITempleteインターフェイスを持つプロパティを実装する度に、
PersistenceMode属性を忘れてしまうんです・・・

永続化方法を判断する(恐らくControlStateと直結してるのかな?)重要な属性なので、
今後忘れないためにもBlogにメモしておきます。

#もうASP.NETネタは書かないって決めたのに、まだまだ知らないことがありますね。


先日、かめたろさんらと飲みに行った際、かめたろさんから「Dynamics CRMの画面を見てみたい」という
リクエストを承りました。

確かに画面を見ながら覚えるのも大切なのですが、その前にある程度、CRMの概要を抑えておく必要があります。
(CRMの概念・背景を理解しないと画面項目見ても意味が分からなくなっちゃうので)
また、今日までに様々なSIベンダーからCRMパッケージが発売されていますが、
何故、多くの企業からCRMパッケージが発売されているのか?
そして、SaaS型のCRMを展開するSalesFource.comやMicrosoft Dynamics CRM Online との違い、
私が過去に携わったことがある某パッケージとの違いも含め、けろ-みおの個人的な視点でCRMの世界を考察したいと思います。 

いろいろとうさんくさいこと言ってるかもしれませんが、間違いがあれば、コメント欄にご指摘頂けると有難いです。

■CRMの市場

CRMの正式名称は、「Customer Relationship Management」、すなわち「顧客関係管理」です。
主に「コールセンター」を持っている企業で導入されている傾向がありますが、
「顧客管理システム」もしくは、顧客情報を取り扱う「アプリケーションパッケージ」の総称として
「CRM」と呼ばれるケースがあります。
(経営層の視点からみると「企業戦略」を手助けするツールの総称として 呼ばれることもあります。 )

「コールセンター」と聞いて一番初めに思いつくのは、ショップチャンネルやニッセン等、TEL一本で
欲しい商品を注文できる通販業者、もしくは、なんらかの顧客サポート・サービスを行っている
企業に設置されている印象が強いのではないかと思います。

顧客は欲しい商品があればTELで注文しますが、その時、TELで応対してくれるのは「オペレーター」と
呼ばれる方々です。CRMの世界では、TEL応対するオペレーターはじめ、
販売や企画、見積等を行う営業スタッフのことを「ユーザ」、注文してきたお客様や
取引している取引先企業のことを「顧客」と 呼んでいます。

これらは、どのCRM製品でも共通した呼び方です。

ところで、このBlogをご覧になっている皆様もこんな経験ありませんか?

例1:
TV通販を見て、「あ!この商品欲しいから商品番号を控えて早速、TELで注文しよう!」

フリーダイヤル用の番号でTEL

しかし、なかなかオペレーターに繋がらない

10分~30分待たされる

ようやくつながったと思ったら、商品が売り切れていた

例2:
なんらかのサービスに加入しているが、そのサービスに対する問い合わせがしたくなった。

TELでないと承ってもらえないサービスだったので、サポートセンターにTELする

どのようなご用件か自動音声が流れるので、指示に従い番号を押す

しかし、なかなかオペレーターに繋がらない

10分以上待たされる

ようやくつながったと思ったら、担当部署ではないのでわからないと言われる

他の部署にTELを転送される

しかしそこでも担当部署ではないと言われ、たらい回しに他部署に回される

ようやく担当部署だと思った瞬間、問い合わせ内容を担当オペレーターがなかなか理解してくれない

TELで問い合わせてから1時間以上経過していた

なんて、経験ありませんか?

例1の場合は、某大手TV通販専用チャンネルで私が実際に経験したことのある体験談ですが、
この場合、オペレーターになかなかつながらなかった考えられる原因として、

1.オペレーターの対応スピードの遅さ
2.導入しているCRMの操作性・レスポンスの悪さ、応対マニュアル(KB)がCRM内に用意されていない
3.導入しているCTI(Computer Telephony Integration / TELやFAXをコンピュータと統合する技術)の問題
4.その日、待機していたオペレーターが教育終えたばかりの慣れないオペレーターだった
5.単純にその日、待機しているオペレーターの数が少なかった

等が考えられます。4.と5.に原因がある場合は、そのサービスを展開している企業の体制に問題があるので、
無視するとして、1.~3.はCRMに大部分の問題があるケースが多いのが特徴です。

酷い企業だと「Accessで顧客管理システムを構築していた」企業もありますが、殆どの企業では
「まともなCRMパッケージを導入し、(SI会社に依頼して)カスタマイズもなんとかしてもらったはずなのに
業務の効率化が図れない。多額のお金を支払ったのに・・・」と思われている企業が非常に多いという
悲しい現実があります。

例えば、CRMパッケージ内に「顧客名」という画面項目がある場合、企業によっては、
「お客様名」「取引先名」の方が良いと言う場合があります。
この場合、SI会社にカスタマイズを依頼し、項目名を変えてもらうわけですが、
たった1つのキャプション(画面項目名)を変更するだけで、数万円~数十万円を請求されるケースも珍しくありません。

結果、少しのカスタマイズで予算を食いつぶされてしまい、根本的なカスタマイズを行えないまま、
本番運用の日を迎えてしまった・・・ というところもありました。
また、CRMパッケージのカスタマイズ事態に限界があり、お客様のご要望にお応えするにはパッケージの母体
そのものを改変しなければならないことも多く、結果、パッケージが持っている本来の品質を損ねてしまった・・・
という失敗経験をされた方も多いのではないでしょうか。

元々、できること、できないことをきちんとユーザ側に説明した上でカスタマイズを行えばこんなことにはならなかったんじゃないか?
と思われると思いますが、世間は何事も組織社会ですので、ユーザやSI企業の経営層あるいは上層部の命令・指示には
従わなければならないこともあります。
そうなると「○○だからできない」という意見さえ、言わせてもらえないケースもあるのではないでしょうか。

それ以外でも、CRMパッケージの画面構成があまりにもコアテクノロジーを使いすぎていて、
「レスポンスが遅い」と何度もClaimを頂戴したこともあります。
(これは、けろ-みおの実際の体験談です。結果セットをCOMを介してXMLで受け取り、そのXMLを非同期通信でクライアントに返し、
XSLTを適用して画面レンダリングさせていた感じです。当時にしては画期的な技術を使ったパッケージでした。
当時はXMLがまだ主流になっていなかった(.NETも出ていなかった)時代でしたので。)

このお客様は帯域の細いVPNを通じてCRMパッケージを稼働させていましたが、
当時は、ネットワークとハードウェアが現在ほど進化しておりませんでしたので、
時代にミスマッチなパッケージを導入させられたという印象をもたれたようです。
パッケージ自体もVPNを使用する想定で作られてなかった(LAN内で使用する想定で作られていた)ため、
ユーザ様の業務ストレスが日に日に溜まっていたのを今でも鮮明に覚えています。

その後、ネットワーク圧縮技術(IISのコンテンツ圧縮を行う3rd Party製品)を使って、
なんとかレスポンスを改善させた経験はありますが、クライアント側でレンダリングするパッケージだったこともあり、
今考えると、端末の性能とレンダリング手法そのものにかなり問題があったんじゃないかと思いました。
(一応、Webアプリケーションだったので)

以上、私の過去の経験談からもわかるように、
「企業のニーズや業務にあった最善のCRMパッケージがなかなか見つからない」
というユーザの不満を解消するため、本来CRMをやっていなかった優秀なSIベンダーやソフトウェアベンダーが
CRMパッケージの世界に名乗りを上げてきたというのが現在の状況です。
また、CRMは、ERPほど業務知識が複雑でないことから、一番販売しやすいパッケージであったんじゃないかと思います。

マイクロソフトがDynamics CRM を販売したのも、だいだい同じような理由から来ています。
(「Dynamics CRM 4.0 徹底解説」という書籍に書いてありました)
多くのユーザさんから優れたCRMパッケージを作って欲しいという要望を受けたとか、受けないとかw
詳しいことは、「Dynamics CRM 4.0 徹底解説」をご覧になってみてくださいw


■設置型(オンプレミス型)とSaaS型

昨今のCRMパッケージは主に、設置型(オンプレミス型)とSaaS型という2種類の展開方法が用意されています。
パッケージによっては、設置型のみ、SaaS型のみというものもありますが、
Dynamics CRM の場合は、両方に対応しているのが強みです。

設置型は、名前の通り、自社内にサーバーを設置し、CRMパッケージを展開する形式です。
重要な顧客情報を取り扱う等、セキュリティを重視した運営を行いたい場合は、設置型を選ぶと良いでしょう。
セキュリティが守られる反面、ハードウェア費、保守・運用費用が高くついてしまうデメリットがありますので、
予算と相談しながら判断して頂きたいところです。

一方、SaaS型は、CRMパッケージを外部サーバーにホスティングするサービスです。
初期投資費用、保守・運用費用が安価で済む反面、セキュリティリスクは設置型よりも高くついてしまうデメリットがあります。
代表的なものとしては、SalesFource.com や Microsoft Dynamics CRM Online 等があります。

SalesFource.com の画面特徴としては、画面デザインが地味で、1画面あたりの入力項目数が多いデメリットがあるものの
レスポンスが良く、非常に安価であることが特徴です。取り扱うデータ数が膨大でなければ、
是非、SalesFource.com のサービスをお勧めしたいところです。
ただSalesFource.com の場合、一度デモ機能を試してしまうと、その後、営業さんからの
コールバックがうるさいので、軽い気持ちでデモを試さない方が良いです。
前向きに導入を検討する気持ちを持ったうえで、デモをご覧にならないと結構大変ですということを付け加えておきます。

一方、Microsoft Dynamics CRM Online は、SPLA(スプラ)契約をマイクロソフトと取り交わしている
企業がホスティングを運営できることになっているそうです。
(この話は、うちの社長から聞きました。敷居が高いと嘆いてましたが・・・)
そのため、もし、Dynamics CRM Online としてホスティング運営を考えていらっしゃる場合は、
SPLAとマイクロソフトとのパートナーシップを締結する必要がありますので、ご注意ください。

利用者側の立場で見ると、Microsoft Dynamics CRM Online の場合、Windows Live ID を使って、
ログインすることになるので、ADのアカウントと紐づけられないできないデメリットが生じます。
また、使用するホスティングによっては、先日紹介したEmail Router のような機能が一部制限されていたり、
あるいは使用できなかったりするので、ホスティングを提供しているサービスや企業を十分調査してから
導入した方が良いでしょう。

ともあれ、Microsoft Dynamics CRM Online も、SalesFource.com 同様、初期費用・保守/運用費用が安価で済むことは
間違いないので、インフラにあまり費用をかけたくない場合は、SaaS型の方が断然良いです。

ちなみに、設置型・SaaS型、どちらを選択しても、カスタマイズにかかる費用は変わりません。
カスタマイズを委託するSI企業をきちんと選択したり、あるいは入札制度を使用して選定する等の工夫は
以前と変わらず必要だということを念頭に置いて下さい。
ただ、Dynamics CRM の場合は、ノンプログラミングでユーザ自身がカスタマイズできる機能が搭載されているので、
簡単なキャプション変更、項目追加程度のカスタマイズであれば、SI企業に依頼しなくて済む可能性はあります。
そこは、業務プロセスと予算とDynamics CRM の機能と相談になりますかね。


■CRMの業務領域って?

恐らく下記のことさえ覚えておけば、基礎知識としては大丈夫です。

・顧客/取引先(企業)
Dynamics CRM では、「取引先」または「潜在顧客」と呼んでます。
某パッケージの場合は、「顧客」という画面の中に「個人」か「会社(企業)」を選択できる項目があるので、それで切り分けています。

・サービス/サポート/問い合わせ/営業案件 等  (これらをインシデントと言います)
Dynamics CRM では、「サービス」と「サポート」の画面はありますが、「問い合わせ」がない。
某パッケージの場合は、「サービス」「サポート」「セールス」でした。

・製品(Product)
Dynamics CRM では、製品の画面は未確認。(あるのかもしれませんが、見る限りないっぽい)
某パッケージの場合は、マスタ的扱いで製品の登録をできる画面がありました。

・サーベイ(アンケート)
Dynamics CRM では、応対マニュアルをKB化する機能があるので、それを使用する。
某パッケージの場合もテンプレート化して使用しますが、アンケートした内容をチェックボックスでチェックしていく機能がありました。

・タスクまたは結果(サービス/サポート/問い合わせ等のインシデントに対する行動結果)
Dynamics CRM の場合、結果入力画面と対応するスケジュールを一目で見ることができます。
また、「ワークプレース」タブから自分に割り当てられたタスクを閲覧することもできます。
某パッケージの場合は、インシデントにタスクが1:1で紐づけられていました。

・キャンペーン
Dynamics CRM にも、某パッケージにも、専用のキャンペーン情報登録画面がありました。
Dynamics CRM が優れているのは、キャンペーンにおける顧客の反応結果に応じて、
そのまま顧客情報と営業案件を自動作成(自動変換)できてしまうところ。
今まで私がやってきたCRMパッケージの中でも、この機能を搭載しているのはDynamics CRM だけ。

・InBound (インバウンド)
例えば顧客からTELやメールがあった時に使われる用語です。
先日紹介したEmail Router は、InBound をサポートするライブラリと言っても良いでしょう。

・OutBound(アウトバウンド)
例えばオペレーターさんや営業さんが顧客に対し、TELやメールをする時に使われる用語です。
先日紹介したEmail Router はOutBound もサポートしているといえばしているのですが、
データ的に正しくOutBoundを取り扱いたい場合、Dynamics CRM の場合、キャンペーンを作成しないと
OutBound 対象データを作成できないみたいです。
(この辺りは、はじめてDynamics CRMを触った時から私が一番気に入らなかったところ)

他にもいろいろありますが、機能(業務)用語としてこれだけ覚えておけば、大丈夫でしょう。
細かいところは、追々やりながら覚えればなんとかなる!と思いたいw

長くなりましたが、まずは画面を見る前にこれらの説明を読んでおけば、今後紹介する
Blogエントリが少し楽に読めるはずです。

次回からは1つ1つの画面を紹介し、最終的にはカスタマイズがどこまでできるのかご紹介させて頂きたいと思います。

 

本当は今回のエントリの前に、「CRMとは何か?」ビジネスの視点でお話するエントリを用意していたのですが、

ここ最近、Exchange Server 2010 の手軽さにハマってしまったので、Blogネタが前後してしまいました。

そんな経緯もあり、今回はExchange Server とも連携しているDynamics CRM 4.0のコンポーネント

「E-Mail Router」の導入手順について紹介したいと思います。 

(CRMビジネスの話はまた次回のBlogネタに取り上げます orz)

 

E-mail Routerとは?


ところで、この「E-Mail Router」とは、いったい何をするものなのでしょうか?

一言で言ってしまうと、「Dynamics CRM と 電子メールサーバーとのインターフェイスを提供する、いわば専用コンポーネントみたいなもの」です。

主な特徴としては、Exchange Server との連携ができるというのが売りなんですが、

Dynamics CRM 4.0 からは、 Exchange Server 以外のメールサーバーでも連携できるようになりました。

(普通にSMTPとPOP3 を構成しているメールサーバーなら何でもOKです。)


 

何故、Dynamics CRM にE-mail Routerが必要なのか?

 

そもそも何故、Dynamics CRM に、「E-mail Router」のようなコンポーネントが必要なのでしょうか?

業務の視点で考察してみましょう。

 

多くのCRMパッケージの場合、電子メールとCRMシステムを完全に分離しています。

「メールを顧客に送信する」機能は持っていたとしても、「送信したメール」をCRMのレコードとして保存しているケースは少ないように思います。

CRMとメールを切り分けている背景としては、社内のインフラ管理形態、セキュリティの問題、またはCRMシステム構造上の問題で、

別々のオペレーションをさせられているケースが考えられます。

ただし、システム的にはそれで良くても、現場で働く営業さん・オペレーターさんにとっては、決して有り難くはない話だと思います。

少なくとも現場にいる面々は、システムに情報入力する時間よりも業務に費やせる時間の方が欲しいはずですから。

 

CRMやシステムのせいで、本来やるべき業務

(営業さんなら商品の販売や売上計画を立てる、オペレーターさんならお待たせしている顧客に対応)が

できなくなってしまった・・・ そんなの嫌ですよね?

 

私も一時期、IT業界から身を引いていた時期があり、その時、アルバイトとして、某大手通販会社の電話オペレーターをやっていました。

もちろん某大手通販会社でも顧客管理の一環としてCRMを使用していたのですが、

いろいろと面倒な画面入力を強いられ、お客様の情報とCRMが紐づかないことも しばしありました。

(メールしたんだけど・・・というお客様からの問い合わせを受けた時は、結構困りました。

どのメールアドレスにお客様がメールしたのかわらなかったため、お客様に手間を取らせてしまったこともあります)

 

このような問題をなくすため、「Dynamics CRM E-mail Router」では、電子メールでやり取りした内容を

CRMに自動紐付けしながら保存する機能が用意されています。

(Outlookで受信したメールをそのままDynamics CRM のレコードとして保存する機能が用意されているので、

メールを主体とした管理・運営を行うことができます。)

 

さらに、CRMに紐づける必要がないメール(紐づけたくないメール)であれば、

メールサーバーのフィルタリング機能(ルール)を使って除外することができます。

フィルタリング機能(ルール)は、Email Router にそのまま適用することができますので、

メールを仕分けるために何かをする必要はありません。

 

送受信された電子メールの内容は、Email Router と 指定した転送メールボックス(メールアドレス)を介して、

Dynamics CRMの「キュー」と呼ばれるエリアにレコードとして保存されます。

そのキューにたまった電子メールデータを「活動レコード」や「取引先(顧客)」「サービス」「サポート」「マーケティング」といった領域に

展開することができます。

 

一般的なCRMパッケージの呼び名だと「活動レコード」は「タスク」という呼び方をしていることが多く、

また、「サービス」「サポート」「問い合わせ」等の 案件を「インシデント」という呼び方をしてることもあります。

Dynamics CRM では、「インシデント」「タスク」という呼び方はしていませんが、概念的には他のCRMパッケージとまったく同じです。

 

たとえば、顧客からの「サポート案件」を営業担当者がメールで回答した場合、回答したメールの内容を「E-mail Router」を介して、

活動レコード(キュー)に保存、その後、どの案件(インシデント)のどんな活動(タスク)をしたのか?

Dynamics CRM 内の任意レコードに紐づけることができます。

 

Office製品やDynamics CRMを使い慣れている従業員/ユーザであれば、

メール一本で一元的な情報管理を行うことができる!というわけですね。

 

ちょっと前置きが長くなってしまいましたが、ここまで説明しないと「E-mail Router」の必要性と導入意義を

ご理解頂けないと思い、実際の運用を例にお話させて頂きました。

今回は、Outlook側の導入手順は触れませんが、「E-mail Router」をサーバー側で導入する手順について、ご紹介させて頂きます。

(IISとExchange Serverの基礎知識がないと苦しいかもしれませんが・・・)

 

Dynamics CRM 4.0 E-mail Routerインストール手順

 

Dynamics CRM 4.0 のメディアをセットし、「E-mail Routerのインストール」を選択する

image 


[インストール ファイルを更新する]を選択する

image 

image 


[ライセンス条項]を読み問題がなければ、[同意する]を選択し、[同意する]ボタンをクリックする(なんだか変w)

image 


[インストール]ボタンをクリックし、その後、[次へ]ボタンをクリックする

image image


[Microsoft Dynamics CRM Email Router サービス]と[メール展開ウィザード]を選択し、[次へ]ボタンをクリックする

image 

インストール先のフォルダを指定し、[次へ]ボタンをクリックする

image 

システム要件を満たしていれば[次へ]ボタンをクリックする。もし、エラーが発生した場合はインストールを中断し、原因を追及してください。

image 


[インストール完了後に・・・]のチェックをONにし、[インストール]ボタンをクリックする

image

image 


下記のようなメッセージが表示されれば、インストール完了です

image 



 

「E-mail Router 構成マネージャ」の設定と各種エラーの対応策


[E-mail Router 構成マネージャ]の[構成プロファイル]タブを選択し、[新規]ボタンをクリックする

image 


受信構成プロファイルをメールサーバーの仕様に従い作成します。
(下記例はExchange Server 2010でEWS(Exchange Web Service)を使用した例。
Exchange Server 2007, 2003 でEWSを使うにはExchange Serverをインストールしたサーバーに
IISとWebDAVを有効にする必要があります。)

image   image

※もし、Exchange Server 2010 のEWSを使った受信構成プロファイルで、後述する「アクセステスト」が
 うまくいかないという方は「更新プログラム ロールアップ8」と「更新プログラム ロールアップ8 (E-mail Router) 」を
 インストールしてみてください。
 Exchange Server 2007 までは、 WebDAVが対応されていたのですが、
 Exchange Server 2010からは、 EWS (Exchange Web Services)に 切り替わっているので、アクセステストがエラーになっていると思われます。

 EWS(Exchange Web Service) でEmail Routerを構成するには「更新プログラム ロールアップ8」の適用が絶対条件になりますので、
 Exchange Server 2010 をご利用の方はご注意ください。
 詳しい話は「Japan Dynamics CRM Team」さんのBlogで紹介されています。


 更新ロールアップ8 入手先:
 http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=c53b2916-6b93-4092-bdd3-a394c96ca000


更新ロールアップ8適用後の受信構成プロファイル設定画面
(Exchange Server 2010 向けに「プロトコル」項目が追加されているのがわかります) 
 image

送信構成プロファイルをメールサーバーの仕様に従い作成します。(下記例はExchange Server 2010の例)

image  image  image 

※SMTPでSubmission Port を使用したい方は、587 を指定します。
 そこは導入しているメールサーバーのSMTP設定状況次第だと思います。
 Exchange Server 2010を標準導入した場合は、25ポート指定でOKです。

 

[展開]タブをクリックした後、[新規]ボタンをクリックします。

image   image

Dynamics CRM を「Microsoft Dynamics CRM Online」やSaaS形式?(って言っちゃって良いのか?)で利用している場合は、
[展開]の項目に、[オンライン サービス プロバイダ]を設定します。(たぶん)

自社内にDynamics CRM をインストールしている設置型の場合は「自分の会社」 を選択、
[既定の構成プロファイル]には、上記で作成した受信構成プロファイルと送信構成プロファイルを指定すればOKです。

[ユーザ、キュー、転送用メールボックス]タブ→[ユーザとキュー]タブをクリックし、[データの読み込み]ボタンをクリックします。
その後、データ転送用のメールアカウントが表示されるのを確認したら、[転送用メールボックス]タブをクリックし、
[転送用メールボックス]を作成します。
imageimage image

後は、[アクセステスト]ボタンで、 メールサーバーとの通信が正しく行われていることを確認します。 
image  

※もし、[データの読み込み]ボタンで[ユーザとキュー]タブに何も表示されなかった場合、
 Dynamics CRM のWeb画面にアクセスし、[設定]領域の[ユーザ]を選択または新規作成します。
 その後、画面に従い、メールボックス転送専用のユーザを新規作成します。
 ユーザを作成する際、「電子メール アクセス構成]欄のうち
 受信側:「転送用メールボックス」送信側:「E-mail Router」にするのをお忘れなく!

image image

転送用メールボックスとは、Email Router が使用する共通のメールボックスだと思ってください。
「転送用メールボックス」が1つ設置してあれば、Dynamics CRM に必要なすべてのメールを
管理することができます。管理側の手間が減るのでできればこちらの設定を推奨していると
MSサポートさんに言われましたw

Exchange Server 2010で動かす場合の事前設定手順については、「Japan Dynamics CRM Team」さんの
Blogで紹介されていますので、併せてご確認ください。
(RBACベースのアクセス制御に準じた設定方法が紹介されてます)

ちなみに私は、今回、下記のようなRBACをPowerShellコマンドレットを使って設定しました。
(実行は、Exchange Management Shellから行いました。)
Remove-ManagementRoleAssignment "ImpersonationName"
Remove-ManagementRoleAssignment "MyBaseOptionsImpersonationName"
Remove-ManagementRoleAssignment "MyContactInformationImpersonationName"
Remove-ManagementRoleAssignment "MyTextMessagingImpersonationName"
Remove-ManagementRoleAssignment "MyDistributionGroupMembershipImpersonationName"
New-ManagementRoleAssignment –Name: "ImpersonationName" -User "crm_test@crm.techbank.jp" -Role:"ApplicationImpersonation"
New-ManagementRoleAssignment –Name: "MyBaseOptionsImpersonationName" -role MyBaseOptions -user "crm_test@crm.techbank.jp"
New-ManagementRoleAssignment –Name: "MyContactInformationImpersonationName" -role MyContactInformation -user "crm_test@crm.techbank.jp"
New-ManagementRoleAssignment –Name: "MyTextMessagingImpersonationName" -role MyTextMessaging -user "crm_test@crm.techbank.jp"
New-ManagementRoleAssignment –Name: "MyDistributionGroupMembershipImpersonationName" -role MyDistributionGroupMembership -user "crm_test@crm.techbank.jp"


Japan Dynamics CRM Team」が紹介している「Impersonation」というロール権限だけを
付与するやり方でも良かったのですが、私の環境ではうまく動かなかったため、その他にも関連するRBACを付与してみました。

※さらに、アクセステストでエラーが出てしまった場合は、構成プロファイルの設定内容やDynamics CRMの転送ユーザ情報、
 IISの設定内容、Exchange Serverの設定内容と構成を見直してください。
 (IISやExchange Server に対する知識がないと相当苦しい思いをします。簡単そうに見える半面、ハマった時の難易度高いです。)

また、[アクセステスト]のエラー内容を調べる方法ですが、 下記をやってみてください。

1.「Microsoft CRM Email Router」サービスを止めてから、
  「%Program Files%\Microsoft CRM Email\Service\Microsoft.Crm.Tools.EmailAgent.xml」 という設定ファイルに
  ログ(トレース)出力モード(LogLevelとLogFileノードを追加)を設定

<ProviderConfiguration deploymentId="3580526f-629d-4f30-843a-dca057b7dd14">
    <ProviderAssembly>Microsoft.Crm.Tools.EmailProviders.dll</ProviderAssembly>
    <ProviderClass>Microsoft.Crm.Tools.Email.Providers.ExchangePollingMailboxProvider</ProviderClass>
    <CrmServerUrl>http://crm-server:5555/crm/</CrmServerUrl>
    <CrmSecureServerPort>0</CrmSecureServerPort>
    <CrmAuthMode>WindowsAuthentication</CrmAuthMode>
    <EmailServer>http://crm-server.crm.techbank.jp/EWS/Exchange.asmx</EmailServer>
    <EmailAuthMode>WindowsAuthentication</EmailAuthMode>
    <EmailUser>CRM\crm_test</EmailUser>
    <EmailPassword>{2A48C4DB-F2BF-48DF-A8EF-20F531EA9BAA}:Wx14HgYjREp9Fp94NZ0jCQ==@CTrPJneCP6EM63fAl+Vhiw==</EmailPassword>
    <EmailAddress>crm_test@crm.techbank.jp</EmailAddress>
    <Target>メールボックス 転送用</Target>
    <Direction>Inbound</Direction>
    <LogLevel>3</LogLevel>
    <LogFile>C:\Smile\EmailRouter.log</LogFile>
    <CacheCapacity>1024</CacheCapacity>
    <IsForwardMailbox>false</IsForwardMailbox>


2.「Microsoft CRM Email Router」サービスを再起動
  (コマンドで、NET STOP MSCRMEMAIL → NET START MSCRMEMAIL を実行しても再起動できます)

3.[アクセステスト]ボタンをクリックし、アクセステストを再実行する

  すると設定ファイルで指定した場所にログが出力され、エラー原因を追及することができます。

 

★ログ出力を有効にしたうえで行ったアクセステストの結果

02/01/2010 10:10:33 : #21381 - メールボックス crm_test@crm.techbank.jp を開いています。
02/01/2010 10:10:33 : #26090 - メールボックス crm_test@crm.techbank.jp を開くときにエラーが発生しました: Microsoft.Crm.Tools.Email.Providers.EmailException: リモート Microsoft Exchange 電子メール サーバーがエラー "(404) Not Found" を返しました。このユーザーまたはキューにはメールボックスがありません。メールボックスを作成してから、やり直してください。 --->
System.Net.WebException: The request failed with HTTP status 404: Not Found.
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Microsoft.Crm.Tools.Email.Providers.ExchangeServiceBinding.ResolveNames(ResolveNamesType ResolveNames1)
at Microsoft.Crm.Tools.Email.Providers.ExchangeWSConnector.IsCurrentUser()
at Microsoft.Crm.Tools.Email.Providers.ExchangeWSConnector.GetService()
at Microsoft.Crm.Tools.Email.Providers.ExchangeWSConnector.OpenMailbox()
at Microsoft.Crm.Tools.Email.Providers.ExchangePollingMailboxProvider.InitExchangeConnector()
--- End of inner exception stack trace ---
at Microsoft.Crm.Tools.Email.Providers.ExchangePollingMailboxProvider.WrapException(Exception e)
at Microsoft.Crm.Tools.Email.Providers.ExchangePollingMailboxProvider.InitExchangeConnector()
at Microsoft.Crm.Tools.Email.Providers.ExchangePollingMailboxProvider.OpenMailbox()
at Microsoft.Crm.Tools.Email.Providers.CrmPollingMailboxProvider.Run()\r\nSystem.Net.WebException: The request failed with HTTP status 404: Not Found.
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Microsoft.Crm.Tools.Email.Providers.ExchangeServiceBinding.ResolveNames(ResolveNamesType ResolveNames1)
at Microsoft.Crm.Tools.Email.Providers.ExchangeWSConnector.IsCurrentUser()
at Microsoft.Crm.Tools.Email.Providers.ExchangeWSConnector.GetService()
at Microsoft.Crm.Tools.Email.Providers.ExchangeWSConnector.OpenMailbox()
at Microsoft.Crm.Tools.Email.Providers.ExchangePollingMailboxProvider.InitExchangeConnector()
02/01/2010 10:10:33 : #19780 - メールボックス crm_test@crm.techbank.jp を閉じています。


Email Router におけるログ設定の詳細については、
Microsoft CRM Support Tool Info (英語)で紹介していますので、併せてご確認ください。


※ちなみに、上記アクセステストで出力されたエラー内容と下記のエラー内容の原因ですが、
 EWS仮想ディレクトリに対するIISの認証設定、もしくはWeb.config の設定が間違っているために発生しているエラーになります。

  image image

EWSはデフォルトで、SSLを使用するように構成されていますので、
もし、SSLを使用しない設定で、 エラーが出てしまった!という方は、下記を試してみてください。


受信ステータス: 失敗:
リモート Microsoft Exchange 電子メール サーバーがエラー "(404) Not Found" を返しました。
このユーザーまたはキューにはメールボックスがありません。メールボックスを作成してから、やり直してください。
The request failed with HTTP status 404: Not Found.
 




SSLの利用状況に応じて、 http://technet.microsoft.com/ja-jp/library/ee633481.aspx に掲載されている手順に従って、
EWS仮想ディレクトリに対するIIS設定と、EWS仮想ディレクトリのWeb.config の中身を修正してみてください。
ちなみに今回紹介しているエントリではSSLを無効にしている状態で紹介しています。。

SSL無効化手順:

1.IISでSSLを無効にする
image

2.EWS(%ProgramFiles%\Microsoft\Exchange Server\V14\ClientAccess\exchweb\ews)のWeb.config の中身を
  「httpsTransport」から「httpTransport」にすべて置き換える
(私はこれに気付かなかったために、相当ハマりました。この手順を教えてくださいました、MSサポートさんに感謝です)




受信ステータス: 失敗:
Client found response content type of '', but expected 'text/xml'.The request failed with an empty response.





EWSの仮想ディレクトリに対する認証方式に、「匿名認証」と「Windows 認証」を有効にしてください。
(ちなみに、[ファイル名を指定して実行]で「inetmgr」と入力するとIISの設定を行える画面を表示することができます)
image

さらに、「Windows認証」の場合は、選択している「認証プロバイダ」と「カーネルモード認証設定」が下記図のように構成されていることを確認してください。
image image


(メール)ルール展開方法について

 

これまで設定してきた内容は、

「Exchange Server は、Dynamics CRMとどのメールボックスを介してやり取りするの?」という設定でした。

今度は、「どのメールについてDynamics CRMとデータを紐づけるの?」 という振り分けルールを設定していきます。

振り分けルールが明確になっていないと、Dynamics CRMとメール連携ができないので、E-mail Routerをインストールした後、

必ず実施する作業になります。なおこれらの作業を、「ルール展開」と呼んでいます。

 

ルールの展開方法は、Exchange Server のバージョンによっても異なっています。

何故、Exchange Server のバージョンによって対応が違うのか?というと

Exchange Server 2010で、 MAPIの扱いが大きく変更されたため、Dynamics CRM Email Router に付随している

[ルール展開ウィザード]が これらの変化に対応しきれていない現状があります。

そのため、Exchange Server 2010に対して「ルール展開」するには、個別に対応を実施することになりますのでご注意ください。

詳しくは、KB97599 をご覧ください。 : http://support.microsoft.com/kb/975995/ja

 

Exchange Server 2007以下の場合:

  • Dynamics CRM Email Router に付随している「ルール展開ウィザード」を使って設定する
  • 「ルール展開ウィザード」の実行には、Microsoft Exchange Server Messaging API (MAPI) が必要
  • MAPIをインストールするサーバーには、Outlookがインストールされていないこと

Exchange Sever 2010の場合:

  • 「ルール展開」を手動で行う必要がある
  • Exchange Server に付随している Outlook Web Access(OWA) がIISにインストールされていること

 

ここでは両方のルール展開方法をご紹介します。

 

Exchange Server 2007以下の[ルール展開]手順:

 

  • 後は画面の指示に従い、画面を進めるだけですが、「Microsoft Dynamics CRM Online」と設置型で指定方法が異なるのと、
    [実行可能なタスクを選択してください]の画面で、メールボックスのルール検証を行い、問題がなければ、
    メールボックスに対するルール展開を行うよう画面を進めていくのがポイントです。
    image image image
    image image image

 

  • もし、ルール展開ウィザード実行中に、「ユーザーの既定のストアにアクセスできませんでした」または、
    「ユーザーの MAPI プロファイルを作成できませんでした」というエラーが発生した場合、
    MAPIをインストールしなおすか、もしくは、導入しているExchange Server のバージョンが
    2007以下であることを確認してください。

 

Exchange Server 2010の[ルール展開]手順:

  • OWA(Outlook Web Access) にアクセスします。
    OWAのURLは環境によって異なりますが、デフォルトはSSL(https)から始まるURLになっています。

    OWAのURL例:https://server-name/owa/

    もし、SSL非対応(http)でOWAにアクセスしたい場合は、IIS と Exchange Serverの設定を変更する必要があります。

    OWAを非SSL(HTTP)アクセスに変更する方法:

    [インターネット インフォメーション サービス (IIS) マネージャー]を開き、[Default Web Site] - [OWA]仮想ディレクトリを展開、
    [SSL 設定]を選択します。その後、[SSLが必要]チェックボックスを外してください。
    image

    [Exchange Management Console]を開き、
    [Microsoft Exchange] - [Microsoft Exchange OnPremise] - [サーバーの構成] - [クライアント アクセス]を選択します。
    その後、[Outlook Web App]タブをクリック→[owa (Default Web Site)]のプロパティをオープン→
    [内部URL]と[外部URL]をhttps:// から http:// に変更します。
    image image

    もし、ECPにも・・・ というメッセージが表示された場合は、[Exchange コントロールパネル]タブの
    [ecp (Default Web Site)]にある、[内部URL]、[外部URL]も https:// から http:// に変更します。
    その際、IISのecp仮想ディレクトリに対しても[SSL 設定]を外すのをお忘れなく。
    (owa仮想ディレクトリとやり方は同じです)
    image

 

  • OWAにアクセスする際、Dynamics CRMにもログインアカウントを持ち、
    Exchange Server にもメールボックスを持っているユーザでログインします。

    ※Dynamics CRMの転送メールボックスで指定したメールボックス以外のユーザでログインしてください。

    ※今回の例では、Dynamics CRM と Exchange Server 両方にアカウントを持ち、
     転送メールボックスにも指定されていない「べジータ」という第三者ユーザを使用します。
     image image
     
  • OWAの右上にある[オプション]をクリックします。
     image

 

  • 左側のメニューから[電子メールの整理]を選択し、[新規作成]をクリックします。
     image

 

  • [新しい受信トレイ ルール]画面の下にある[その他オプション]をクリックします。
    image

 

  • [実行する処理]ドロップダウンリストから、
    [転送、リダイレクト、または送信] → [メッセージの転送]を選択します。
     image

 

  • 転送先のメールボックスをダブルクリックで指定し、[OK]ボタンをクリックします。
    「転送先のメールボックス」とは、Dynamics CRM のユーザ設定で[電子メールアクセス種類]に
    [転送メールボックス]が設定しているユーザのメールボックスのことを指してます。
    (このエントリでは、crm_test@crm.techbank.jp というメールボックスを指定しています)
    image    

 

  • [新しい受信トレイ ルール]画面の下にある[ルールの名前]に、任意の名前を入力し、
    さらに、[メッセージの到着時、および:] ドロップダウンリストに、Dynamics CRMと連携を行いたい
    メッセージルールを選択します。

    ※この例では、「CRM_TEST 転送ルール」という名前で「ルールの名前]を入力しています
    ※また、この例では、[すべてのメッセージに適用]を選択していますが、Dynamics CRM 用と通常メールを区分けしたい場合は、
    [すべてのメッセージに適用]を選択しないでください。できるだけ絞ったルールを適用するのが効果的です。

    すべての指定が終わったら、[保存]ボタンをクリックしてください。
     image

 

  • OWAの  [受信トレイのルール]画面で、作成したルールが表示されているのを確認します。
     image

 

  • 最後にルールを展開したユーザのDynamics CRM 設定を変更します。
    ルールを展開したユーザのADアカウントでログインし、
    http://server-name:portnumber/[組織名(表示名)]/ にアクセスします。
    その後、Dynamics CRMの左横にある[ワークプレース]タブから、[ワークプレースの個人設定]
    (ASP.NETでいうところのPersonalizeですね)をクリックします。
    image

  • [個人用オプションダイアログ]にある[電子メール]タブをクリックし、
    転送先メールボックスに接続するための情報とどのようなメールをDynamics CRMで追跡(連携)させるのかを指定します。
     email_setting

以上で設定完了です。

これでExchange Serverのメールボックスに配信されたメールがDynamics CRM のデータと紐付いた業務運用ができるようになります。



それでは、軽く試してみましょう。動作確認を行う前に、念のため「Microsoft CRM Email Router」サービスを再起動 しておいてください。

(コマンドで、NET STOP MSCRMEMAIL → NET START MSCRMEMAIL を実行しても再起動できます)


実験手順1:外部メールもしくは、Exchange Server 内にいる別ユーザから、ルールを展開したユーザ宛(この例だとべジータ)にメールを送ってみます。

image


実験手順2:次に、ルールを展開したユーザ宛にメールが届いているか、OWAまたはOutlook等のメーラーを使って確認します。

image


実験手順3:さらに、この内容がDynamics CRMにも紐づいているか確認します。
ルールを展開したユーザのADアカウントでDynamics CRM にログインし、[ワークプレイス]タブから[キュー]を選択します。
すると、べジータさん宛に送信されたメールが、そのままべジータさんの未処理タスクとして割り当てられたことがわかります。

email_que1 email_que2

 

その反対に、べジータさん宛に「見積依頼」のメールを送信してきた「カプセルコーポレーション」のブルマさん宛に
べジータさんは返信を返すこともできます。その返信メールもDynamics CRM と自動的に紐づけられるようになるため、
CRMとメールと二重管理しなくて済む運用が可能になります。
(残念ながら今回は、その逆パターンをお見せする気力がないので紹介しませんが)

 

 

Dynamics CRM E-mail Router のまとめ

 

★E-mail Router があれば、メールとDynamics CRM を連携させ、一元管理できる体系を構築することができる

★E-mail Router は概念的にわかりやすいデプロイツールだが、エラー発生時のトラブルシューティングがまだまだ確立されていない。

★IISとExchange Server の概念を知らないと、結構痛い目に合います。

★Exchange Server 2010のルール展開は「ルール展開ウィザード」ではなく、手動で設定してあげる必要がある

★Exchange Server も E-mail Router もSSLの利用を推奨している。非SSLにするには、個別の対応が必要

★E-mail Router は、Exchange Server 以外のメールサーバーにも対応している。POP3 と SMTPが対応しているメールサーバーであれば導入可能。

 

ふぅ~。以上です。

ものすごく、長いエントリになってしまいすいません。それだけこのEmail Routerの導入はそんなに簡単ではないことがご理解頂けたかと思います。

Dynamics CRM製品を担当されているMSの関係者の方々(けろ-みおと面識のある営業さんとサポートさん)にいろいろと質問をしながら、

なんとかEmail Routerを導入する環境を構築することができました。

いろんなエラーとぶつかりながら、戦った1週間でしたが、今後、同様の問題で悩んでいらっしゃる方々のために、

そして、Dynamics CRM の今後の発展を祈願する意味も込めまして、このエントリを掲載させて頂きたいと思います。

 

次回は、CRMの業務の話を交えながら、Dynamics CRM のメリット・デメリットをご紹介できればいいなと思います。

最後までご購読頂き、有難うございました。

 

ネタ元:[PowerShell] : Active DirectoryのユーザをCSVファイルを元に一括作成する

http://techbank.jp/Community/blogs/mymio/archive/2010/01/25/24176.aspx

 

前回は、ADユーザをCSVファイルを元に一括作成する方法をPowerShellを用いてご紹介しましたが、

今回はその応用で、作成したユーザに対し、Exchange Server 2010用のメールボックスも一緒に作成してしまうというものです。

 

■Active Directory内のOU構成例

 

 

■取り込み情報のCSVファイル(前回と違うのは、ExchangeOUという列を追加しています。)

カンマ区切りのCSVですが、OU列だけ、値を "(ダブルクォート)で括ってます。

SamAccountName Surname DisplayName OU ExchangeOU
goku 孫悟空 孫悟空 OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/管理部門/goku
gohan 孫悟飯 孫悟飯 OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/管理部門/gohan
goten 孫悟天 孫悟天 OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/管理部門/goten
chichi チチ チチ OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/管理部門/chichi
vegeta べジータ べジータ OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/システム部門/vegeta
buruma ブルマ ブルマ OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/システム部門/buruma
tranks トランクス トランクス OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/システム部門/tranks
bura ブラ ブラ OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/システム部門/bura
kuririn クリリン クリリン OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サービス部門/kuririn
18-gou 18号 18号 OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サービス部門/18-gou
marron マーロン マーロン OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サービス部門/marron
kamesennin 亀仙人 亀仙人 OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サービス部門/kamesennin
yamucha ヤムチャ ヤムチャ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/yamucha
pu-al プーアル プーアル OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/pu-al
u-ron ウーロン ウーロン OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/u-ron
tenshinhan 天津飯 天津飯 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/tenshinhan
chaozu 餃子 餃子 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/chaozu
yajirobe ヤジロベー ヤジロベー OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/yajirobe
umigame ウミガメ ウミガメ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/umigame
piccoro ピッコロ ピッコロ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/piccoro
mr.popo ミスター・ポポ ミスター・ポポ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/mr.popo
gyuumaou 牛魔王 牛魔王 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/gyuumaou
baba 占いババ 占いババ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/baba
carin カリン カリン OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/carin
enma 閻魔大王 閻魔大王 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/サポート部門/enma
bidel ビーデル ビーデル OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/bidel
mr.satan ミスター・サタン ミスター・サタン OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/mr.satan
pan パン パン OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/pan
dende デンデ デンデ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/dende
lunch ランチ ランチ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/lunch
breef ブリーフ ブリーフ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/breef
erasa イレーザ イレーザ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/erasa
shapuna シャプナー シャプナー OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/shapuna
ubu ウーブ ウーブ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/ubu
gotenks ゴテンクス ゴテンクス OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/gotenks
vegitto ベジット ベジット OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/vegitto
gogeta ゴジータ ゴジータ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/gogeta
bartakku バーダック バーダック OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp crm.techbank.jp/CRM/営業部門/bartakku

 

■CSVファイルのテキストイメージ


SamAccountName,Surname,DisplayName,OU,ExchangeOU
goku,孫悟空,孫悟空,"OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp",crm.techbank.jp/CRM/管理部門/goku
gohan,孫悟飯,孫悟飯,"OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp",crm.techbank.jp/CRM/管理部門/gohan
goten,孫悟天,孫悟天,"OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp",crm.techbank.jp/CRM/管理部門/goten
...........
...........
...........

 

■ADユーザ&Exchange Server メールボックス一括作成コード(PowerShell)

function New-CrmUser($csvpath="C:\Scripts\Users.csv", $password="P@ssW@rd#123") {
    
    BEGIN {
        # 引数チェック
        if ( $csvpath == $null ) {
            return "インポート元のCSVファイルは必ず入力しなきゃダメじゃん"
        }
        elseif ( $password == $null ) {
            return "パスワードはちゃんと入れないと情報漏洩しちゃうぞ!"      
        }
        
        # Exchange Serverに接続
        trap { continue; }
        $session = New-PSSession -ConfigurationName Microsoft.Exchange `
                  -ConnectionUri http://crm-server.crm.techbank.jp/PowerShell/ `
                  -Authentication Kerberos `
                  -AllowRedirection `
                  -ErrorAction SilentlyContinue
           
        if ( !($session) -and  !([System.String]::IsNullOrEmpty($error[0])) ) {
            return "Exchange Serverに接続できんぞ"
        }
        
        Import-PSSession -Session $session -AllowClobber

        # ユーザ情報CSVファイルの読み込み
        trap { continue; }
        $users = Import-CSV $csvpath
        if ( !($users) -and  !([System.String]::IsNullOrEmpty($error[0])) ) {
            return "ユーザ作成情報(CSVファイル)を取り込めん"
        }     

        # AD用ライブラリの読み込み
        Import-Module ActiveDirectory
        
        # 初期パスワードの生成
        [System.Security.SecureString]$secPass = (ConvertTo-SecureString $password -AsPlainText -force)
        
    }
    PROCESS {
        
        $serverName = "crm-server.crm.techbank.jp"
        
        # ADユーザの作成
        foreach ( $user in $users ) {  
        
            $SamAccountName = $user.SamAccountName
            $DisplayName = $user.DisplayName
            $Surname = $user.Surname
            $Ou = $user.OU
            $ExchangeOu = $user.ExchangeOU

            
            Write-Host "作成中:$SamAccountName"
            
            # ADのユーザを作成
            trap { $error.Clear(); continue; }
            New-ADUser  -SamAccountName $SamAccountName `
                        -Name $SamAccountName `
                        -AccountPassword $secPass `
                        -ChangePasswordAtLogon $true `
                        -Surname $Surname `
                        -DisplayName $DisplayName `
                        -Path $Ou `
                        –Enabled $true `
                        -UserPrincipalName "$SamAccountName@crm.techbank.jp" `
                        -LogonWorkstations $serverName `
                        -OtherAttributes @{'msDS-PhoneticDisplayName'=$DisplayName}  

            # 作成したADユーザに対し、Exchange Serverのメールボックスを割り当てるためのコマンドライン生成
            trap { $error.Clear(); continue; }
            Enable-Mailbox -Identity $ExchangeOu -Alias $SamAccountName
            
        }
    }
    END {
        # Exchange Server との接続を解除する
        trap { $error.Clear(); continue; }
        Remove-PSSession -Session $session
        
        return "我が道を行く!Going my way! そして、正常終了"
    }
}

 

ADに接続するためには、ActiveDirectoryというモジュールをImportすればOKですが、Exchange Server の場合は、

リモートでExchange Server に接続してからでないとExchange Server 用のPowerShellコマンドレットを

使用することができません。

Exchange Server には専用のPowerShellコンソール(Exchange Management Shell)があるので、

Exchange Management Shellを使用する場合は、今回の例で示したようなリモート接続は必要ありません。

 

ただ、PowerShell ISEなど、Exchange Management Shell以外のコンソールからExchange Server のコマンドレットを使用する場合は、

リモート接続が必要になりますので、ご注意ください。

このコードだと、New-PSSession、Import-PSSession、Remove-PSSession がリモート接続にかかわる処理になります。

 

処理の流れとしては見たままですが、補足しておくと、先にADユーザを作成してからExchange Server 用のメールボックスを作成する場合は、

「Enable-Mailbox」コマンドレットを使用します。

一方、「New-Mailbox」というコマンドレットがExchange Server にありますが、

こちらは、ADユーザもExchange Serverメールボックスも何も作成していない時に、

ADユーザとメールボックスをセットで作成してしまうコマンドレットになりますので、ご注意ください。

今回の例も、New-MailboxコマンドレットでADユーザとメールボックスをセットで作成する形にしても良かったのですが、

New-Mailboxコマンドレットの引数の多さに嫌気がさしてしまったので、New-ADUser と Enable-Mailbox の組み合わせで実装させて頂きました。

この辺りは、好みの問題もありますかね。

 

■実行結果

Active Directoryユーザ

image 

Exchange Server メールボックス

image 

 

ちなみに、リモートSessionさえ確立されていれば、

Invoke-Expression で、Exchange Server 用のコマンドレットをISEから実行することもできます。

今回の例のように、ANDIのOU構成名をCSVファイルで保持させなくても、ドメイン名、OU名、アカウント名という情報があれば

連想配列にして後でANDIやExchange Serverメールボックス識別名を文字列で組み立てるやり方もありだと思っています。

ぜひぜひ、メールサーバー管理者の方々にお試し頂きたく存じます。


ZDNet Japan に第5回目となる、私のインタビュー記事が掲載されました。

■バラバラのデータ授受をBranchCacheで一本化できると期待

http://japan.zdnet.com/extra/windows7_panel_200912/story/0,3800102051,20407839-4,00.htm

 

話の趣旨としては、

 

「【識者に聞く】データの効率的な受け渡しと生産性の向上にBranchCacheは効くか?」

 

というお題の中で、Windows 7 や Windows Server 2008 R2 に搭載された
「BranchCache」について自論を展開しています。

実は、自宅でBranchCacheを試したんですが、ちょっと違うなぁと思う印象がありました。
インデックスとどのように連携取っているのか?についても相当謎です。

なお、上記記事に対して、意見を寄せてくれた読者の中から毎回1名様に、
Amazon商品券5,000円分 をプレゼント してくれるそうなので、
是非是非、記事にご意見をお寄せ下さいませ。 
(私をはじめとする識者の意見が違うよ等あれば、遠慮なくご指摘くださいませ)
(あまりにもコメントする方が少ないので、ちょっと盛り上げて欲しいです。野良さん1人が頑張ってる感じですw
野良さんに全額商品券持って行かせないためにも、ご協力よろしくお願いしますw)

それから、私以外にも9名の識者が登場しておりますので、他の識者の記事も併せてご覧いただけると有難いです。

他識者のご意見・経験談(第五回目用):
http://japan.zdnet.com/extra/windows7_panel_200912/story/0,3800102051,20407839,00.htm

次回(第6回目)のお題はまだ頂いてませんが、来週から怒涛のMCP受験ラッシュ(MCTSの2試験とMBMSと4試験)なので、 
しばらくの間はお題を振らないで~ って感じですw
いずれにしても次回が最終回になるような気がしてますので、最後くらいはきちんとしたものを書きたいです。

どうぞ宜しくお願いします。s

 

今回は、PowerShell入門ネタになります・・・ 

実は、ADユーザをCSVファイルを元に一括作成するには、PowerShellを使うと便利ってことに気づいちゃいました。

下記のようなCSVファイルを用意し、一括登録できるようにしてみました。

結構便利です。

 

OUの構成 

 

 

CSVの中身

SamAccountName Surname DisplayName OU
goku 孫悟空 孫悟空 OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp
gohan 孫悟飯 孫悟飯 OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp
goten 孫悟天 孫悟天 OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp
chichi チチ チチ OU=管理部門,OU=CRM,DC=crm,DC=techbank,DC=jp
vegeta べジータ べジータ OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp
buruma ブルマ ブルマ OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp
tranks トランクス トランクス OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp
bura ブラ ブラ OU=システム部門,OU=CRM,DC=crm,DC=techbank,DC=jp
kuririn クリリン クリリン OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp
18-gou 18号 18号 OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp
marron マーロン マーロン OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp
kamesennin 亀仙人 亀仙人 OU=サービス部門,OU=CRM,DC=crm,DC=techbank,DC=jp
yamucha ヤムチャ ヤムチャ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
pu-al プーアル プーアル OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
u-ron ウーロン ウーロン OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
tenshinhan 天津飯 天津飯 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
chaozu 餃子 餃子 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
yajirobe ヤジロベー ヤジロベー OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
umigame ウミガメ ウミガメ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
piccoro ピッコロ ピッコロ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
mr.popo ミスター・ポポ ミスター・ポポ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
gyuumaou 牛魔王 牛魔王 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
baba 占いババ 占いババ OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
carin カリン カリン OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
enma 閻魔大王 閻魔大王 OU=サポート部門,OU=CRM,DC=crm,DC=techbank,DC=jp
bidel ビーデル ビーデル OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
mr.satan ミスター・サタン ミスター・サタン OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
pan パン パン OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
dende デンデ デンデ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
lunch ランチ ランチ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
breef ブリーフ ブリーフ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
erasa イレーザ イレーザ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
shapuna シャプナー シャプナー OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
ubu ウーブ ウーブ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
gotenks ゴテンクス ゴテンクス OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
vegitto ベジット ベジット OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
gogeta ゴジータ ゴジータ OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
bartakku バーダック バーダック OU=営業部門,OU=CRM,DC=crm,DC=techbank,DC=jp
 

コード:

function Set-CrmUser($csvpath="C:\Scripts\Users.csv", $password="P@ssW@rd#123") {
    
    Write-Host $csvpath

    # AD用ライブラリの読み込み
    Import-Module ActiveDirectory

    # ユーザ情報CSVファイルの読み込み
    $users = Import-CSV $csvpath

    # 初期パスワードの生成
    [System.Security.SecureString]$secPass = (ConvertTo-SecureString $password -AsPlainText -force)
    
    # ADユーザの作成
    foreach ( $user in $users ) 
    {  
        $SamAccountName = $user.SamAccountName
        $DisplayName = $user.DisplayName
        $Surname = $user.Surname
        $Ou = $user.OU
        
        Write-Host "作成中:$SamAccountName"
        
        # ADのユーザを作成
        New-ADUser -SamAccountName $SamAccountName -Name $SamAccountName -AccountPassword $secPass -PasswordNotRequired $true -PasswordNeverExpires $false -Surname $Surname -DisplayName $DisplayName -Path $Ou –Enabled $true -OtherAttributes @{'msDS-PhoneticDisplayName'=$DisplayName}       
    }
}

 

なぜ、ADユーザを作成していたかというと、Dynamics CRMの検証のため作成していたんですが、

手動でユーザ作成するのが面倒になってしまったので、自作のコマンドレットを用意してみたというオチです。

 

上記の応用で、Exchange Server 用のメールアカウントも同時に作成できるようにすれば

活用の幅が広げられそうです。それにしても、ISE便利です。(HIROさんの言うとおりでした)


ZDNet Japan に第三回目となる、私のインタビュー記事が掲載されました。

■VHDの活用で削減できるコスト、できないコスト

http://japan.zdnet.com/extra/windows7_panel_200912/story/0,3800102051,20406477-6,00.htm

 

話の趣旨としては、

 

「【識者に聞く】仮想ディスク、あなたならどう使う?」

 

というお題の中で、仮想ディスクをはじめとする「Dynamic IT」導入で
ITビジネスがどれぐらいの費用対効果をもたらすのか?を掲載しています。
本当は、費用対効果を数値化したかったんですが、執筆の締切が短かったこともあり、
記載できませんでした。

今回は、かなりビジネス寄りのお話なので、導入決定権を持っている企業のTOP、幹部職員、アーキテクト向けの
お話になりますので、ITビジネスの話にあまり関心がなく、
常に技術を追求していきたい方にとっては、少し物足りない記事かもしれません。

なお、上記記事に対して、意見を寄せてくれた読者の中から1名様に、Amazon商品券5,000円分 をプレゼント
してくれるそうなので、読者の方々の「Dynamic IT」におけるご意見もどんどん投稿してください。
(逆に、私をはじめとする識者の意見が違うよ等あれば、遠慮なくご指摘くださいませ)

それから、私以外にも9名の識者が登場しておりますので、いろんな方の経験談・意見が紹介されています。
他の識者の記事も併せてご覧いただけると有難いです。

他識者のご意見・経験談:
http://japan.zdnet.com/extra/windows7_panel_200912/story/0,3800102051,20406477,00.htm

次回(第四回目)のお題も既に頂いており、近日中に掲載される予定です。
どうぞよろしくお願いします。


Virtual PC や Hyper-V で仮想ディスクを作成すると、VHDという仮想ディスク用のファイルを作成できるんですが、
Windows 7 / Windows Server 2008 R2 では、Virutal PC などがなくても、簡単にVHDファイルを作成できるように
なったというのはご存じの方も多いと思います。

しかも、Virtual PC や Hyper-V で作成したVHDにも簡単に接続でき、
さらに、VHDをマウントしてブートまでできるようになりました。

このあたりの話はさすがにもう有名なので、詳細は、

http://www.computerworld.jp/topics/win7/151010.html
http://blogs.msdn.com/tomohn/archive/2009/07/23/vhd-boot-settings-tips.aspx

をご覧頂くとして、今回、取り上げるネタは、上記サイトのように、
VHDにBCDEDITしてブートできるよう設定したのに、何故だかブートできない!という方向けのネタになります。

BCDEDITし、下記のようなエラーがWindows Boot Manager(起動時の黒い画面) で表示された方が
今回の対象です。

エラー内容:
「Windowsブート構成データ(BCD)ストアのファイルに無効な情報が含まれています」
「0xC000000F ブート構成データストアのオブジェクト内の要素の構成が無効です」

このようなエラーが出てしまった場合、BCDEDITコマンドではなく、BCDBOOT コマンドの実行を試してみてください。

BCDBOOT F:\windows /l ja-jp 


BCDBOOTコマンドを実行する前に、[コンピュータの管理] から [ディスクの管理]を右クリックし、
[VHDの接続]でマウントしたいVHDファイルを接続しておきます。
その後、上記のようなBCDBOOTコマンドで、接続したVHDドライブのWindowsディレクトリに設定するような形で
ブート設定して頂くと、Windows Boot Managerがエラーを出すことなく、従来のOS or VHDのOS どちらで
起動するか尋ねる画面が表示されると思います。

もし、同じような現象で悩まれた方は、参考にしてみてください。

それから、Windows Server 2008 R2 x64 のVHDファイルを用意したいが作れない!!!って悩んでいる方、
いらっしゃいませんか?
Windows Server 2008 R2 x64のVHDを作るには、Virutal PC では対応していないので、Hyper-V が
必要になります。しかし、Hyper-V の環境やWindows Server 2008 の環境すら持ってないよという方は、
Windows Server 2008 R2 x64の180日評価版(いずれも英語版)がインストールされたVHDファイルを
MSのサイトから入手することができますので、どうか諦めず、試して頂きたいなと思います。

Windows Server 2008 R2 x64の180日評価版(英語版)のVHD
http://technet.microsoft.com/en-us/bb738372.aspx

OSが英語だと抵抗があるという方は、Windows Server 2008 R2 x64の180日評価版(英語版)のVHDを
BCDEDITやBCDBOOTでマウントし、起動した後、Language Pack をインストールすると日本語表示に
切り替わり、操作もしやすくなります。また、なんかしらのWindows Server 2008 R2 x64 の
プロダクトキーとライセンスを持ってる場合は、Windowsライセンス認証を行うことができますので、
どうか英語版だからと諦めず、お試し頂ければなと思います。

さて、VHDにインストールしたExchange Server 2010 環境をぶっ壊してしまったので、
VHDにOSから入れなおす予定です。。。
Exchange Server 2010 のインフォメーションストアのチェックが厳しすぎ・・・orz

 

Exchange Server 2010 のインストールでの話ですが、実は、Exchange Server 2010 は、

インストール時にプロダクトキーの入力を求められないんです。

早い話がインストール後にプロダクトキーを入力しなさいというスタイルですね。

 

このプロダクトキーを入力しないと、120日間は体験版となり、さらに120日を過ぎて、

入力しなかった場合、仮に、Exchange Server 2010 Enterprise Editionでインストールしていても、

Exchange Server 2010 Standard Edition として動作し、さらにマイクロソフトからのサポートを

受けられないといった制約事項があるようです。

Exchange Server は、2000 の時に本格的にいじくりまわしてましたが、時代が変わり、2010で

画面が激変していたのは驚きました。

以前、かめたろさんが紹介してくれた ISA Server の最新エディションを見た時と同じくらいの

カルチャショックを受けました。もう年かな。

 

ちなみに、このExchange Server 2010 Enterprise Editionには、「Exchange Management Shell」というのが

サポートされており、ベースはPowerShellです。

上述のプロダクトキー入力も、実は「Exchange Management Shell」のPowerShellコマンドレットでできちゃうんです。

「Exchange管理コンソール」の操作方法がイマイチよくわからなかったので、「Exchange Management Shell」で

プロダクトキー入力しちゃいましたw 

 

Exchange Server 2010 プロダクトキー入力コマンドレット

Set-ExchangeServer -Identity crm-server -ProductKey {プロダクトキー}

 

それから、Exchange Server 2010には、どれぐらいのコマンドレットがあるかというと、Get-Command で見る限り、1021個みたいですね。

((Get-Command).Count を使って調査 ※エイリアスとかFunctionも含んでる数ではありますが)

パッと見ただけでも、Exchange Server 用のFunctionがこんなにあるんだとビックリしました。

ま、なぜ、Exchange Server をインストールしたかというと、Dynamics CRM 4.0 との連携を試すために入れてみたんですが、

時代が変わり、激変したExchange Server に、戸惑っている、けろ-みお でした。。。

 


Dynamics CRM に興味をもたれた方のBlogでは既にインストール方法が紹介されていますが、
正規のインストール方法だと、下記のようなエラーが発生することがあります。

エラーパターン1:

「サービス msftesql がコンピュータ ‘xxx’ で見つかりませんでした。」

DynamicsCRM_Install18_2

msftesqlは、SQL Server フルテキストインデックス用サービスの実行ファイルですね。

「SQL Server フルテキストインデックスサービス」をインストールしているにもかかわらず、
このエラーが発生した方は、この後、後述するインストール手順を踏んでみてください。

原因は、SQL Server のフルテキストインデックスがSQL Server 内のインスタンスで有効になっているかどうか
Dynamics CRM 4.0のインストーラーがチェックする仕組みが組み込まれているんですが、
そもそも、フルテキスト検索は、SQL Server のインスタンスに依存することがあっても、
Windows Server 2008 のサービスに依存しているわけではないので、
インストーラーが間違ったチェック(サービスに対してチェック)を行っているせいで
無駄なエラーを発生させているというオチになっています。

詳細は、マイクロソフトのKB952601にも紹介されていますので、併せてご確認いただければと思います。

エラーパターン2:

Microsoft Windows オペレーティング システム:
「サービス cisvc がコンピュータ ‘XXX’ で見つかりませんでした」
「コンピュータの再起動が保留であることが検出されました」

Microsoft SQL Server :
「サービス SQL Server Agent(SQLServerのインスタンス名)(SQLSERVERAGNET)がサーバー’XXX’で実行されていません」

DynamicsCRM_Install18 

このパターンの場合はエラーメッセージの通りですね。

必要な対処:
・「コンピュータの再起動が保留であることが検出されました」
    → マシンを再起動しましょう。

・「サービス cisv がコンピュータ ‘XXX’ で見つかりませんでした」
    → 「インデックスサービス」をインストールしてください。

 DynamicsCRM_Install20  


・「サービス SQL Server Agent(SQLServerのインスタンス名)(SQLSERVERAGNET)がサーバー’XXX’で実行されていません」
    →「サービス」マネージャで、SQL Server Agentを開始してください。
      また、SQL Server Agentの「スタートアップ種類」を「手動」ではなく、「自動」に変更しておいてください。

image



Dynamics CRM 4.0 インストール手順(更新プログラムのロールアップをしながら行う方法)

下記の手順は、「エラーパターン1」(「サービス msftesql がコンピュータ ‘xxx’ で見つかりませんでした。」 )のような
エラーが発生してしまった方向けのインストール手順です。
このインストール手順は、マイクロソフトのKB952601でも紹介されていますが、
紹介されているconfig ファイルの設定内容がわかりずらい&間違っているので、
正しいやり方をこちらでご紹介させて頂きたいと思います。

なお、Dynamics CRM 4.0 に必要なものは、SQL Server 2005 or 2008、IIS、インデックスサービス が最低でも必要です。
また、自身でサーバを用意(設置型)し、イントラネット・エクストラネット、もしくは、Exchange Server との連携を行う場合は、
Active Directoryが必要です。
(Dynamics CRM Onlineを使用する場合は、Active Directoryは不要。
Dynamics CRM をホスティングする場合は、ホスティング会社の設定情報次第で変わる)

詳しくは、handcraft さんが詳しくまとめていらっしゃるので、そちらをご参照ください。

Dynamics CRM を動作させるための必要条件(handcraftさんのBlog):
http://soliac.spaces.live.com/blog/cns!EF2E8E61023188AE!228.entry?wa=wsignin1.0&sa=569293904
(トラックバック:http://soliac.spaces.live.com/blog/cns!EF2E8E61023188AE!228.trak

手順1:更新プログラム(Server_i386.msp)をダウンロードします。 (この例では、C:\Dynamics CRM というフォルダに保存します)

更新プログラム(x86)の入手先: http://go.microsoft.com/fwlink/?LinkID=94937&clcid=0x411

更新プログラム(amd64)の入手先:http://go.microsoft.com/fwlink/?LinkID=104228&clcid=0x411

手順2:config.xml というファイルを下記のように作成し、任意のフォルダに保存します。

<CRMSetup>
  <Server>
    <Patch update="true">C:\Dynamics CRM\Server_i386.msp</Patch>
  </Server>
</CRMSetup>


手順3:Dynamics CRM 4.0 のメディアをドライブにセットし、コマンドプロンプトで下記のように実行します。

ドライブ名:
cd Server\[i386 または、amd64]
SetupServer.exe /config “手順2で保存したconfig.xmlの保管場所”


DynamicsCRM_Install18_3 


手順4:後は画面に従いインストールすればOKです。


更新ファイルを入手してからインストールしたい場合は、「インストールファイルを更新する」を選択します。
DynamicsCRM_Install2
DynamicsCRM_Install3


ライセンスコードを入力します。
DynamicsCRM_Install4


ライセンス条項を読み、問題がなければ、「同意する」を選択します。
DynamicsCRM_Install5 


[インストール]ボタンをクリックし、必要なコンポーネントをインストールします。
インストールが終わったら、[次へ]ボタンをクリックします。
DynamicsCRM_Install6
 

Dynamics CRM を同じネットワーク内にある別サーバーに1台もインストールしていない、
まったくの新規インストールであれば、「標準」を選択します。

DynamicsCRM_Install7

 

新規インストールであれば、「新しい展開の作成」を選択し、
「SQL Serverをインストールしているコンピュータ名またはIPアドレス」を入力します。

DynamicsCRM_Install8



表示名と名前、使用する通貨コード、SQL照合順序を選択します。
なお、表示名は、IISで使用される仮想ディレクトリの名前だと思ってください。

インストール後のURL例:http://[DynamicsCRM 4.0をインストールしたサーバー]:ポート番号/表示名/

DynamicsCRM_Install9
また、照合順序については、過去に私が書いたエントリがあるので、そちらをご参考ください。
照合順序:http://techbank.jp/Community/blogs/mymio/archive/2009/10/24/20971.aspx


DynamicsCRM_Install10
DynamicsCRM_Install11


Webサイトの選択で、[Default Web Site]を選択した場合は、通常、80ポートにインストールされます。
(IISの設定を変更していなければの話)

・[Default Web Site]を選択した場合のURL例:
       http://[DynamicsCRM 4.0をインストールしたサーバー]/表示名/

・ポート番号を選択した場合のURL例:
       http://[DynamicsCRM 4.0をインストールしたサーバー]:ポート番号/表示名/

DynamicsCRM_Install12 

レポートサーバーのURLがあれば指定します。(特に意識しない場合は、デフォルトで表示されているURLでOK)
DynamicsCRM_Install13


Active Direcotry の OU(組織)を選択します。
間違って、ドメインコントローラを選択しないよう注意します。
DynamicsCRM_Install14


セキュリティアカウントの設定で、
偽装するユーザ(IISで作成されるCRM用アプリケーションプールのユーザ)を選択します。
DynamicsCRM_Install15

偽装って何?と思われた方は、下記のエントリをご参考くださいませ。(IIS6ベースの話ではありますが)
http://techbank.jp/Community/blogs/mymio/archive/2009/07/06/9869.aspx


Exchange Server をはじめ、SMTPやPOP3が搭載されたメールサーバーとの連携を行いたい方は、
電子メールルータを指定します。
今回の例では、電子メール連携 を使わないので、未入力のまま[次へ]をクリックします。

DynamicsCRM_Install16



電子メールルータを指定しなかった場合、下記のような警告が出ますが、無視しても大丈夫です。

DynamicsCRM_Install17


システム要件がすべて満たされていることを確認します。
エラーが発生した場合は、エラー内容を確認&原因を調査した後、
「戻る」ボタンをクリック、もしくはインストールを中止してください。

DynamicsCRM_Install21


[インストール]ボタンでインストールを開始します。

DynamicsCRM_Install22


インストールが完了すると下記のような完了画面が表示されます。
マシンスペックにもよりますが、だいたい3分~5分ぐらいでインストールが完了するはずです。

DynamicsCRM_Install23 


手順5:ブラウザを開き、インストールした、Dynamics CRM 4.0に接続できるか確認します。
URL例:http://[DynamicsCRM 4.0をインストールしたサーバー]:ポート番号/表示名/


画面表示例:
DynamicsCRM_Install24


まとめ:
インストール時のシステム要件チェックがかなり厳しく、更新プログラムも頻繁に出ていることから、
Setup.exe をそのまま実行し、インストールするのではなく、更新プログラムを適用したインストール方法が
Dynamics CRM 4.0の場合、 望ましいのかなと思います。

インストール時に、冒頭のエラーが出てしまった方は、このインストール方法を参考にして頂きたいと思います。


あけましておめでとうございます。昨年はいろいろと暗いニュースが多く、私個人にとっても
将来を考えさせられる1年だったので、今年はもっと明るい話題が提供できれば良いなと思います。
そんなわけで、本年も宜しくお願いします。

さて、私事で大変恐縮ですが、本年もMicrosoft MVP を ASP/ASP.NET のジャンルで再受賞させて頂きました。
昨年はこのtechbank.jpというコミュニティを運営する難しさを知った1年でしたが、
techbank.jp でBlogを書いていらっしゃるメンバーの方々はじめ、
techbank.jpで立ち上げている各種書籍執筆プロジェクトに参加している著者の皆様、校正スタッフの皆様にも
支えて頂いた結果、再受賞させて頂くことができました。
ご協力頂いているメンバーの皆様には、この場をお借りし、厚く御礼申し上げます。

また、昨年まではASPやASP.NET、ISAPI、Access + VBA, PowerShellを扱ったTIPSをBlogで紹介しておりましたが、
今年からは発想を変え「ビジネスに通用するITソリューション」を銘打ったBlogエントリをUPしていきたいと考えております。

さすがにもうASPやASP.NETは、世の中の方にもだいぶ浸透したんじゃないかと思いますし、.NETテクノロジーに
対する抵抗感を感じる人も少なくなってきたんじゃないかと思います。
また、Windows Azureなどの最新テクノロジーは、かめたろさん等、研究している方も多いことから、
今年からはDynamics CRMを活用したソリューション構築例を紹介していきたいなと思います。

現在、マイクロソフトでは、xRM 戦略と題して、Dynamics CRM をCRM/顧客情報管理分野以外にも
情報ソリューション基盤として活用するという戦略を打ち立てたそうです。
言い換えると、xRM の「x」は「Customer」の「C」にする必要はないという戦略ですね。

この xRM 戦略で活用できるDynamics CRMの各種アドオンの作り方、活用方法等を中心にBlogで紹介できればいいなと思います。
システムを利用する立場のユーザ、パッケージの導入を決定する意思決定者、アドオンを作る開発者・保守担当者など
立場関係なく、Dynamics CRMの利点・欠点、競合他社のCRM製品と何が違うのか?を紹介できるBlogを
目指していきたいと思いますので、どうぞ本年も宜しくお願いします。
最新投稿をさらに見る 次ページ »