2005年01月 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2004年01月01日

メールボックスインポートスクリプト

Exchange 2000 Server, Exchange Server 2003 で、メールボックスを CSVファイルからインポートして一括作成・更新するスクリプトです。
シングルドメインで、すべて Users コンテナに作成します。
エラー処理はイマイチですが、問題があったら大体止まると思います。
何かやる前にログ出力してから実行するので、作成されるログファイルを見たらどこで止まったかわかります。
実際に使用していたものから特殊なことを取り除いたので、修正したときのバグはあるかもしれません。

動作確認:SBS2000(Windows 2000 Server SP4), SBS2003 RC(Windows Server 2003)

ImportRecip.vbs


'
' 受信者一括インポートスクリプト
'
' メールボックスが有効なユーザ、メールが有効なユーザを作成します。
' メールボックスの場合は転送先アドレスと両方に配信するかどうかを指定できます。
' 転送先は con0-エイリアス, con1-エイリアス, ... という名前で作成し、
' alt-エイリアス という名前のグループに入れて代理受信者に設定します。

Option Explicit

' デフォルトのインポートファイル名
Const strDefaultImportFileName = "ImportRecip.csv"
' デフォルトのログファイル
Const strDefaultLogFileName = "ImportRecip.log"

' 組織の DNS名
Const strDefaultOrganizationDNSName = "exchange-admin.biz"

' 組織名
Const strDefaultOrganizationName = "EXCHANGE-ADMIN"

' 管理グループ名
Const strDefaultAdministrativeGroupName = "最初の管理グループ"
' Exchange Server 2003 のデフォルトは "first administrative group"

' ストレージグループ名
Const strDefaultStorageGroupName = "最初のストレージ グループ"

' 最大転送アドレス数(0番目を含まない)
Const MaxForwardingAddresses = 9

Dim strNeededColumnHeader
' インポート用 CSVファイルの1行目を、次の項目名並びと同じにしてください(" を除く)
' 使用する項目名並び
strNeededColumnHeader = _
"alias,password,external_address,ServerName," & _
"LastName,FirstName,DisplayName,Department,Title," & _
"DeliverBoth,ForwardingAddress0," & _
"ForwardingAddress1,ForwardingAddress2,ForwardingAddress3," & _
"ForwardingAddress4,ForwardingAddress5,ForwardingAddress6," & _
"ForwardingAddress7,ForwardingAddress8,ForwardingAddress9"

' 意味は
'
' エイリアス(アカウント名を兼ねる)
' パスワード(新規作成の場合のみ設定)
' 外部アドレス(メールが有効なユーザの場合)
' サーバ名(メールボックスが有効なユーザの場合)
' 名字
' 名前
' 表示名
' 部署
' 役職
' メッセージを転送先とメールボックスの両方に配信する(1 or 0)
' 転送先アドレス0
' 転送先アドレス1
' 転送先アドレス2
' ・
' ・
' ・

Dim objFileSystemObject
Dim objFile
Dim mapColumnNameIndex
Dim strColumnNames
Dim strLogFileName

Dim strDelivaryDomain
Dim strServerName
Dim strOrganizationDNSName
Dim strDomainPath
Dim strOrganizationName
Dim strAdministrativeGroupName
Dim strStorageGroupName
Dim strStoreName
Dim nMailEnabled
Dim nMailBoxEnabled
Dim nMailBoxMustMove
Dim nMailBoxMustDelete

strLogFileName = strDefaultLogFileName
strOrganizationDNSName = strDefaultOrganizationDNSName
strDomainPath = "DC=" & Replace(strOrganizationDNSName, ".", ",DC=")
strOrganizationName = strDefaultOrganizationName
strAdministrativeGroupName = strDefaultAdministrativeGroupName
strStorageGroupName = strDefaultStorageGroupName
nMailEnabled = 0
nMailBoxEnabled = 0
nMailBoxMustMove = 0
nMailBoxMustDelete = 0

Call Main

' メイン
Sub Main()
Dim strFilePath
Dim strLine
Dim strLineTop
Dim bHeaderLoaded
Dim aHeader
Dim i
Dim aLine

' ファイル名の取得
strFilePath = GetImportFileName()
If strFilePath = "" Then
Call Cleanup()
Exit Sub
End If

' ファイルシステムオブジェクト・テキストストリームオブジェクト作成
Set objFileSystemObject = Nothing
Set objFile = Nothing
Set objFileSystemObject = CreateObject("Scripting.FileSystemObject")
Set objFile = objFileSystemObject.OpenTextFile(strFilePath)
If objFileSystemObject Is Nothing Or objFile Is Nothing Then
Call Cleanup()
MsgBox "ファイルシステムオブジェクトまたはテキストストリームオブジェクト作成失敗"
Exit Sub
End If

LogWriteLine ""
LogWriteLine ""
LogWriteLine ""
LogWriteLine "開始 " & Now
' ヘッダーの読み込み
bHeaderLoaded = False
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
If LoadHeader(strLine, aHeader) = True Then
bHeaderLoaded = True
Exit Do
End If
Loop

' ヘッダーが無かったら終了
If bHeaderLoaded = False Then
Call Cleanup()
MsgBox "ヘッダー無し"
Exit Sub
End If

' 項目名-インデックスマップの作成
Set mapColumnNameIndex = Nothing
Set mapColumnNameIndex = CreateObject("Scripting.Dictionary")
If mapColumnNameIndex Is Nothing Then
Call Cleanup()
MsgBox "項目名-インデックスマップの(オブジェクト)作成失敗"
Exit Sub
End If

For i = 0 To Ubound(aHeader) Step 1
mapColumnNameIndex.Add aHeader(i), i
Next
Erase aHeader

strColumnNames = strNeededColumnHeader

' データ行の読み込み
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
If IsComment(strLine) = False Then
aLine = Split(strLine, ",")
If IsArray(aLine) Then
Call DoUpdateRecipient(aLine)
Erase aLine
End If
End If
Loop

LogWriteLine "-------------------------------------------------------------------------------"
LogWriteLine "終了 " & Now
LogWriteLine "メールが有効なユーザー:" & CStr(nMailEnabled)
LogWriteLine "メールボックス:" & CStr(nMailBoxEnabled)
LogWriteLine "移動すべきメールボックス:" & CStr(nMailBoxMustMove)
LogWriteLine "削除すべきメールボックス:" & CStr(nMailBoxMustDelete)
LogWriteLine "-------------------------------------------------------------------------------"
LogWriteLine ""
Call Cleanup()
MsgBox "終了"
End Sub

' 終了処理
Sub Cleanup()
On Error Resume Next
Set mapColumnNameIndex = Nothing
Set objFile = Nothing
Set objFileSystemObject = Nothing
End Sub

' ログ出力
Sub LogWrite(str)
Dim objText
Set objText = objFileSystemObject.OpenTextFile(strLogFileName, 8, True)
objText.Write str
objText.Close
Set objText = Nothing
End Sub

Sub LogWriteLine(str)
LogWrite(str & vbCrLf)
End Sub

' ファイル名の取得
Function GetImportFileName()
Dim strImportFile

' プロンプト
strImportFile = InputBox("インポートファイル名を入力してください", _
"インポートファイル名の入力(ImportRecip)", strDefaultImportFileName)

If Len(strImportFile) > 5 Then
strLogFileName = Left(strImportFile, Len(strImportFile) - 4) & ".log"
End If

GetImportFileName = strImportFile
End Function

' ヘッダー行の読み込み
Function LoadHeader(strLine, aHeader)
If IsComment(strLine) = True Then
LoadHeader = False
Exit Function
End If

aHeader = Split(strLine, ",")
If IsArray(aHeader) = False Then
LoadHeader = False
End If

LoadHeader = True
End Function

' コメント行の判定
Function IsComment(strLine)
If LTrim(strLine) = "" Then
IsComment = True
Exit Function
ElseIf Left(LTrim(strLine), 1) = "'" Then
IsComment = True
Exit Function
End If
End Function

Sub DoUpdateRecipient(aLine)
Dim strCallingSequence
Dim strHeader
Dim aColumnName
Dim i

aColumnName = Split(strColumnNames, ",")

strCallingSequence = "Call UpdateRecipient("""
For i = 0 To UBound(aColumnName) Step 1
If i <> 0 Then
strCallingSequence = strCallingSequence & """, """
End If
If mapColumnNameIndex.Exists(aColumnName(i)) Then
If UBound(aLine) >= mapColumnNameIndex.Item(aColumnName(i)) Then
strCallingSequence = strCallingSequence & aLine(mapColumnNameIndex.Item(aColumnName(i)))
End If
Else
' 必要な項目が無い
MsgBox "必要な項目が無い"
Exit Sub
End If
Next
strCallingSequence = strCallingSequence & """)"

Erase aColumnName
Execute strCallingSequence
End Sub

' 受信者の更新
Sub UpdateRecipient(alias,password,external_address,ServerName,LastName,FirstName, _
DisplayName,Department,Title,DeliverBoth,ForwardingAddress0,ForwardingAddress1, _
ForwardingAddress2,ForwardingAddress3,ForwardingAddress4,ForwardingAddress5, _
ForwardingAddress6,ForwardingAddress7,ForwardingAddress8,ForwardingAddress9)

Dim objPrimitiveUser
Dim objUser
Dim objContainer
Dim rn
Dim objMailRecipUser
Dim objMailBox
Dim HomeMDBURL
Dim objPrimitiveGroup
Dim objGroup
Dim objPrimitiveContact
Dim objMailRecipGroup
Dim objMailRecipContact
Dim strContactPath
Dim aProxyAddresses
Dim varProxy
Dim bFound
Dim strAppendAddress
Dim i
Dim param
Dim bMemberExists

If alias = "" Then
Exit Sub
End If
LogWriteLine "-------------------------------------------------------------------------------"
LogWriteLine "開始:" & Now & " " & alias

rn = "CN=" & alias
Set objContainer = GetObject("LDAP://CN=Users," + strDomainPath)

' ユーザーオブジェクト
LogWriteLine "ユーザーオブジェクト"
On Error Resume Next
Set objPrimitiveUser = Nothing
Set objPrimitiveUser = objContainer.GetObject("user", rn)
If objPrimitiveUser Is Nothing Then
' ユーザが見つからない
On Error GoTo 0
LogWriteLine "user オブジェクトを作成"
Set objPrimitiveUser = objContainer.Create("user", rn)
objPrimitiveUser.Put "samAccountName", alias
objPrimitiveUser.Put "userAccountControl", 66048
objPrimitiveUser.Put "userPrincipalName", alias
objPrimitiveUser.Put "sn", LastName
objPrimitiveUser.Put "givenName", FirstName
objPrimitiveUser.Put "description", DisplayName
objPrimitiveUser.Put "displayName", DisplayName

LogWriteLine "user オブジェクトをコミット"
objPrimitiveUser.SetInfo

Set objUser = objPrimitiveUser ' IADsUser を使う
LogWriteLine "パスワードを設定"
objUser.SetPassword password
Else
On Error GoTo 0
LogWriteLine "user オブジェクトを取得"
objPrimitiveUser.Put "userPrincipalName", alias
objPrimitiveUser.Put "sn", LastName
objPrimitiveUser.Put "givenName", FirstName
objPrimitiveUser.Put "description", DisplayName
objPrimitiveUser.Put "displayName", DisplayName

LogWriteLine "user オブジェクトをコミット"
objPrimitiveUser.SetInfo

Set objUser = objPrimitiveUser ' IADsUser を使う
End If

If Department <> "" Then
objPrimitiveUser.Put "department", Department ' 部署
objPrimitiveUser.Put "physicalDeliveryOfficeName", Department ' 事業所
Else
objPrimitiveUser.PutEx 1, "department", ""
objPrimitiveUser.PutEx 1, "physicalDeliveryOfficeName", ""
End If
If Title <> "" Then
objPrimitiveUser.Put "title", Title ' 役職
Else
objPrimitiveUser.PutEx 1, "title", ""
End If

objPrimitiveUser.SetInfo
Set objMailRecipUser = objPrimitiveUser

' グループと連絡先の掃除

' 転送アドレスループ
For i = 0 To MaxForwardingAddresses Step 1
rn = "CN=con" & CStr(i) & "-" & alias
' 転送用連絡先を削除する
On Error Resume Next
Set objPrimitiveContact = Nothing
Set objPrimitiveContact = objContainer.GetObject("contact", rn)
If Not objPrimitiveContact Is Nothing Then
' 連絡先があった
On Error GoTo 0
LogWriteLine "転送用連絡先" & CStr(i) & "を(一旦?)削除"
objContainer.Delete objPrimitiveContact.Class, objPrimitiveContact.Name
Set objPrimitiveContact = Nothing
End If
On Error GoTo 0
Next

' 転送用配布リストを削除
rn = "CN=alt-" & alias
On Error Resume Next
Set objPrimitiveGroup = Nothing
Set objPrimitiveGroup = objContainer.GetObject("group", rn)
If Not objPrimitiveGroup Is Nothing Then
On Error GoTo 0
LogWriteLine "転送用配布グループを(一旦?)削除"
objContainer.Delete objPrimitiveGroup.Class, objPrimitiveGroup.Name
End If
On Error GoTo 0

' メールボックスが必要かどうか
If external_address <> "" Then
'-------------------------------------------
' メールが有効なユーザー(メールボックス無し)
'-------------------------------------------
LogWriteLine "メールが有効なユーザー"
Set objMailBox = objUser
' メールボックスが有効な場合は削除する(かな?)
If objMailBox.HomeMDB <> "" Then
' メールボックスを削除
LogWriteLine "削除する必要があるメールボックス"
'objMailBox.DeleteMailBox
nMailBoxMustDelete = nMailBoxMustDelete + 1
Else

' メールを無効にする
LogWriteLine "メールを一旦無効にする"
On Error Resume Next
objMailRecipUser.MailDisable
On Error GoTo 0
' メールを有効にする
objMailRecipUser.Alias = alias
LogWriteLine "メールを有効にする"
objMailRecipUser.MailEnable("SMTP:" & external_address)
LogWriteLine "外部アドレスを設定"
objMailRecipUser.SMTPEmail = external_address

' SecondaryProxyAddresses に内部のアドレスを入れる
LogWriteLine "内部アドレスを追加"
aProxyAddresses = objMailRecipUser.ProxyAddresses
bFound = False
strAppendAddress = "smtp:" & alias & "@" & strOrganizationDNSName
If VarType(aProxyAddresses) = 8204 Then ' Variant 型配列
For Each varProxy In aProxyAddresses
If UCase(CStr(varProxy)) = UCase(strAppendAddress) Then
bFound = True
End If
Next
If bFound = False Then
ReDim Preserve aProxyAddresses(UBound(aProxyAddresses) + 1)
aProxyAddresses(UBound(aProxyAddresses)) = strAppendAddress
objMailRecipUser.ProxyAddresses = aProxyAddresses
End If
Erase aProxyAddresses
ElseIf VarType(aProxyAddresses) = 8 Then ' 文字列型
If UCase(aProxyAddresses) <> UCase(strAppendAddress) Then
objMailRecipUser.ProxyAddresses = Array(aProxyAddresses, strAppendAddress)
End If
Else
objMailRecipUser.ProxyAddresses = Array(strAppendAddress)
End If

nMailEnabled = nMailEnabled + 1
End If
Else
'-------------------------------
' メールボックスが必要なユーザー
'-------------------------------
LogWriteLine "メールボックスユーザー"

strServerName = UCase(ServerName)
LogWriteLine "サーバー:" & strServerName
strStoreName = "メールボックス ストア (" & strServerName & ")"
LogWriteLine "ストア:" & strStoreName

' メールボックス
Set objMailBox = objUser
' HomeMDB プロパティを組み立てる
HomeMDBURL = _
"CN=" & strStoreName & _
",CN=" & strStorageGroupName & ",CN=InformationStore," & _
"CN=" & strServerName & ",CN=Servers," & _
"CN=" & strAdministrativeGroupName & "," & _
"CN=Administrative Groups,CN=" & strOrganizationName & "," & _
"CN=Microsoft Exchange,CN=Services," & _
"CN=Configuration," & strDomainPath

If objMailBox.HomeMDB = "" Then
' メールボックスが無い
' メールが有効な可能性があるので無効にする
LogWriteLine "メールを無効にする"
On Error Resume Next
objMailRecipUser.MailDisable
On Error GoTo 0
objPrimitiveUser.Put "mailNickname", alias
LogWriteLine "メールボックスを作成"
objMailBox.CreateMailbox HomeMDBURL
ElseIf objMailBox.HomeMDB <> HomeMDBURL Then
' メールボックス移動
LogWriteLine "メールボックスの移動が必要"
nMailBoxMustMove = nMailBoxMustMove + 1
'objMailBox.MoveMailBox HomeMDBURL
End If

' プライマリSMTPアドレス
objMailRecipUser.SMTPEmail = alias & "@" & strOrganizationDNSName

' 転送用配布グループ
rn = "CN=alt-" & alias
LogWriteLine "配布グループを作成"
Set objPrimitiveGroup = objContainer.Create("group", rn)

'typedef enum {
' ADS_GROUP_TYPE_GLOBAL_GROUP = 0x00000002,
' ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 0x00000004,
' ADS_GROUP_TYPE_LOCAL_GROUP = 0x00000004,
' ADS_GROUP_TYPE_UNIVERSAL_GROUP = 0x00000008,
' ADS_GROUP_TYPE_SECURITY_ENABLED = 0x80000000
' } ADS_GROUP_TYPE_ENUM;

objPrimitiveGroup.Put "samAccountName", "alt-" & alias
objPrimitiveGroup.Put "groupType", 4
LogWriteLine "配布グループをコミット"
objPrimitiveGroup.SetInfo

Set objGroup = objPrimitiveGroup

' 転送アドレスループ
For i = 0 To MaxForwardingAddresses Step 1
' 転送用連絡先を作成して、配布グループのメンバーにする

rn = "CN=con" & CStr(i) & "-" & alias
param = "ForwardingAddress" & CStr(i)

' 転送先アドレスがあれば連絡先を作成して配布グループに追加
If Eval(param & " <> """"") = True Then
LogWriteLine "連絡先オブジェクト" & CStr(i) & "を作成"
Set objPrimitiveContact = objContainer.Create("contact", rn)

Set objMailRecipContact = objPrimitiveContact
objMailRecipContact.Alias = "con" & CStr(i) & "-" & alias

Execute "objPrimitiveContact.Put ""displayName"", " & param
Execute "objMailRecipContact.MailEnable(""SMTP:"" & " & param & ")"

objMailRecipContact.HideFromAddressBook = True
LogWriteLine "連絡先オブジェクト" & CStr(i) & "をコミット"
objPrimitiveContact.SetInfo

strContactPath = objPrimitiveContact.AdsPath
LogWriteLine "配布グループに連絡先" & CStr(i) & "を追加"
objGroup.Add strContactPath

bMemberExists = True
End If
Next

Set objMailRecipGroup = objGroup
If objMailRecipGroup.Alias = "" Then
objMailRecipGroup.Alias = "alt-" & alias
LogWriteLine "配布グループのメールを有効にする"
objMailRecipGroup.MailEnable
End If
objMailRecipGroup.SMTPEmail = "alt-" & alias & "@" & strOrganizationDNSName
objMailRecipGroup.HideFromAddressBook = True
LogWriteLine "配布グループをコミット"
objPrimitiveGroup.SetInfo

' 配布グループ作成後のメールボックスの処理
If bMemberExists = True Then
' メールボックスの代理受信者に設定
LogWriteLine "代理受信者を設定"
objMailRecipUser.ForwardTo = objPrimitiveGroup.AdsPath
LogWriteLine "メールボックスに残すかどうかを設定"
If DeliverBoth = "1" Then
objMailRecipUser.ForwardingStyle = 1
Else
objMailRecipUser.ForwardingStyle = 0
End If
'cdoexmRecipientOrForward 0 代理受信者のみへ配信
'cdoexmDeliverToBoth 1 受信者と代理受信者の両方に配信
Else
' 転送先が無ければ配布グループを削除
LogWriteLine "転送先が無かったため、代理受信者用配布グループを削除"
objContainer.Delete objPrimitiveGroup.Class, objPrimitiveGroup.Name
' メールボックスの代理受信者設定を外す
objMailRecipUser.ForwardingStyle = 0
LogWriteLine "代理受信者を解除"
objMailRecipUser.ForwardTo = ""
End If

nMailBoxEnabled = nMailBoxEnabled + 1
End If

LogWriteLine "ユーザーオブジェクトをコミット"

objPrimitiveUser.SetInfo

LogWriteLine "終了:" & Now & " " & alias
LogWriteLine ""
LogWriteLine ""

On Error Resume Next

Set objMailRecipGroup = Nothing
Set objMailRecipContact = Nothing
Set objGroup = Nothing
Set objPrimitiveGroup = Nothing
Set objPrimitiveContact = Nothing
Set objMailRecipUser = Nothing
Set objMailBox = Nothing
Set objUser = Nothing
Set objPrimitiveUser = Nothing
Set objContainer = Nothing
End Sub


コメント

初めてこちらのサイトを
拝見させていただきました。
csvからインポートしてメールボックスを・・・
今やっている業務と同じ内容かな?と
思いながら拝読させていただいております。

私はプログラムの知識があまり無いため、
まだ勉強が必要だなと痛感しております。

部署が変わったばかりで
あまりよくわかっていないのですが、ExchangeSvrで、
カスタム受信者を代理受信者として
転送先に指定しています。

今回、その代理受信者を
「なし」に戻すためのフィールドを
探しているのですがご存じないでしょうか?

何千件分かを解除するのですが、
そのフィールドを見つけられず、
困っております。
代理受信者設定時は、
「Alt-Recipient」で
相手先を指定していたため、 「Null」にし、「deliver-and-redirect」を
「0」にするのですが、
解除できずにおります。

何かご存知の情報があれば、
ご教授いただければ幸いです。

よろしくお願い申し上げます。

Posted by: at at 2004年04月18日 00:25

このサンプルで言うと、次の部分に相当します。

メールボックスの代理受信者設定を外す
objMailRecipUser.ForwardingStyle = 0
LogWriteLine "代理受信者を解除"
objMailRecipUser.ForwardTo = ""

つまり IMailRecipient インターフェースの ForwardingStyle と ForwardTo をクリアすることによって転送を解除できます。

Posted by: nakatani at 2004年04月18日 10:43

早速アドバイスをいただき、
ありがとうございました。

「ForwardingStyle」
「ForwardTo 」
というようなフィールドがあったんですね!!

Exchangeのメールボックスについて
全てのフィールドとして紹介されていた
サポート技術情報サイトのフィールド以外にも
様々なフィールドが存在することを知り
ネットで検索しておりましたが
これらのフィールドを見つけることは
出来ませんでした。
数週間悩んでおりましたので
ものすごく感動しております。

心から深謝申し上げます。

また、早速明日試して
結果を報告させていただきます。

PS
ダブって投稿してしまい
申し訳ありませんでした。

Posted by: at at 2004年04月18日 14:09

参考のために、サポート技術情報の KB 番号教えてもらえますか?
さて、ADSI でプログラミングする場合は、同じオブジェクトに対して、必要に応じて複数のインターフェースを使い分ける局面が出てきます。
メール受信者の管理は IMailRecipient インターフェースを使います。

2000用SDKより
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wss/wss/_cdo_imailrecipient_interface.asp
2003用SDKより
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/e2k3/e2k3/_cdo_imailrecipient_interface.asp

転送を外すという操作を単純化すると、次のようなコードになります。

Set objContainer = GetObject("LDAP://CN=Users,DC=exchange-admin,DC=biz")
Set objPrimitiveUser = objContainer.GetObject("user", "cn=nakatani")
Set objMailRecip = objPrimitiveUser
objMailRecip.ForwardingStyle = 0
objMailRecip.ForwardTo = ""
objPrimitiveUser.SetInfo

この中に

Set objMailRecip = objPrimitiveUser

という行があります。
これは、既に取得したオブジェクトをわざわざ別の変数にセットして、こっちの変数は IMailRecipient インターフェースで使い続けるという意図があります。
これは必須ではないし、VBScript の構文上で何のインターフェースを使っているかを指定できるわけでもありません。
しかし、こうやって利用するインターフェースごとに変数を分けておかないと、期待どおり動作しないことがあったので、私はこういう作り方を習慣付けています。

Posted by: nakatani at 2004年04月19日 11:18

とても勉強になるアドバイスをいただき
本当にありがとうございます。

私がフィールド情報として参考にしていたのは

☆[XADM] ディレクトリインポート、エクスポートで使用するヘッダーについて
http://support.microsoft.com/default.aspx?scid=kb;ja;412853&Product=exchangeJPN

でした。
最近、送受信禁止の設定をするために
調べていたとき
上記以外に「DXA-Task」という
フィールドが存在するらしいことを知ったりと
まだまだ未熟な私です。

早速、教えていただいた
「ForwardingStyle」
「ForwardTo 」
というフィールドについて
データをエクスポートして確認しようとしたところ
「属性 ForwardingStyle は不明です。」
というエラーが返ってしまいました。
Exchange 5.5だからなのかもしれません。

全てのヘッダー情報は、
ExchangeのResourceKitの中に
含まれているらしいのですが
該当CDが無く、
今、社内を探しているところです。

もう少し調べてから
またご報告させていただきます。

Posted by: at at 2004年04月19日 23:53

イタタ、5.5 でしたか。それなら私のサンプルも今までの話も全く関係ありません。
フィールドは Alt-Recipient と Deliver-and-Redirect で合ってると思いますよ。
解除する際に値に何を指定するべきかは、まず次のような必要な項目ヘッダだけのファイルを作り、

Obj-Class,Common-Name,Alt-Recipient,Deliver-and-Redirect

このファイルを指定してエクスポートします。
そうすると転送設定が無い場合に、どのような値が入っているかがわかります。
転送を解除したいメールボックスの該当するフィールドを、転送が無いメールボックスと同じ値に書き換えてインポートしてやれば解除できると思います。
Alt-Recipient が複数の値を持つフィールドの場合は(かどうかは覚えていません)、インポートする際のオプションに「複数の値を持つフィールドを上書きする」とかいうオプションがあるので、それを選んでやれば空白にできます。

Deliver-and-Redirect は多分、メールボックスと代理受信者の両方に配信 か何かそういう意味のやつですよね。

Posted by: nakatani at 2004年04月20日 09:49

最初にバージョンを申し上げておらず、
申し訳ありませんでした。

ExchangeServerの設定について
5.5と2000で
大きく違っている事を知らなかったため
ご迷惑をおかけしました。

前任者が手作業が嫌で、
メールボックスをインポートする仕組みを
ネットで探して作ったと言っていたので、
こちらのサイトを拝見し、
それを5.5用にアレンジしたのでは?
と予想しています。

教えてくださったように
フィールド名のファイルを作成し、
設定値を変えるたびにエクスポートして
比較しているのですが、
Nullに戻しても、表示が変わりませんでした。

Alt-Recipient では
複数の値を指定しているため、
インポートする際のオプションの
「複数の値を持つフィールドを上書きする」
を選ばなくてはいけなかったのだと思います。
(この項目を触ったことはありませんでした。)

希望の光が見えてきました。
明日試して、また報告させていただきます。
本当にありがとうとございます。

Posted by: at at 2004年04月20日 23:33

昨夜、ワクワクしながら布団に入り、
今朝、会社に行くと、
上司が急なクレーム対応のため外出になり
試せませんでした。
(サーバデータに関して
 新たな操作を試すときには
 必ず上司が同席している状態で・・・
 と言われております故)

明日、改めてご報告致します。

Posted by: at at 2004年04月21日 23:49

ご連絡が遅くなり、申し訳ありません。
昨日も上司が戻らず、本日やっと試すことが出来ました。

インストール時のオプションで○追加ではなく、●上書きで試しましたところ
残念ながら、「配信オプション」タブで
カスタム受信者の名前は表示されたままで、
●なしの状態に戻すことは出来ませんでした。

「複数の値を持つフィールドを上書きする」
についてヘルプで確認をすると、
SMTP,X-400の値などの場合に上書きされるようで
ここでは「電子メール」タブのような
1つのフィールドに複数の値が入る場合のことなのかも?との事でした。

また、転送のためのフィールド探しと同時に
Exchange Server 5.5 のResourceKit(ヘッダー情報が入っているらしいので)を
探していきます。

調べ方や、考え方など確認事項を教えていただき、
本当にありがとうございました。

深謝申し上げます。

Posted by: at at 2004年04月23日 23:29

Exchange 5.5 をインストールして試してみました。

Obj-Class,Common-Name,Alt-Recipient,Deliver-And-Redirect
Mailbox,test,~DEL,0

これで消えます。
#う~ん、こんなのだったっけなぁ。全然覚えてない・・・

Posted by: nakatani at 2004年05月16日 08:39
コメントする









名前、アドレスを登録しますか?