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月19日

たかがバックアップされどバックアップ

Microsoft Exchange 2000 Server の障害回復
Microsoft Exchange 2000 Server 障害復旧ガイド
[XADM] Exchange 2000 Server のバックアップおよび復元方法
[XADM] Exchange 2000 を同じサーバー名のまま新規のハードウェアに移動する方法
[HOWTO] Windows 2000 Server オペレーティング システムの完全バックアップを実行する方法
[HOW TO] 単一サイトの Exchange 2000 でインフォメーション ストアを復元する方法
[XADM] バックアップ時にパッチ ファイルが作成されない
[XADM] オフライン バックアップの復元に Isinteg -patch は不要
[XADM] Exchange 2000 のメールボックスに赤い X が表示される
[XADM] Exchange 2000 の [最新のバックアップ セット] チェック ボックスとハード リカバリについて
[XADM] バックアップからデータベースを復元すると、イベント ID 904、8012、8010、および 8003 がログに記録される
メタベースの復元手順でシステム状態のバックアップが必要になることがある
[XADM] 障害復旧にはメタベースのバックアップおよび復元が含まれる
Exchange 2000 Server データベースの回復
Exchange 2000 Server の障害復旧 : 最悪の事態からのサバイバル ガイド
[XADM] Exchange 2000 Server のオフライン バックアップと復元処理
[XADM] データベースの修復または不整合の確認手順 (2000)
障害回復インストール後にシステム アテンダントが起動せず、イベント ID 9022、9149、1005 のメッセージが表示される

同じ名前でサーバを作り直したときにディレクトリのゴミ箱を掃除しておいた方がいいみたい。
[OL2003] Exchange 2000 Server で MAPI プロファイルにメールボックスを追加できない
How to Replay Log Files That Have Been Generated Since the Last Full Backup on an Exchange 2000 Server That is in a Different Forest
後続のログ ファイルを再生せずにストレージ グループ内のデータベースを復元する
[XADM] オンライン復元後にデータベースをマウントできない

POP3ログ

[XCCC] Exchange 2000 で POP3 および IMAP4 用にプロトコル ログ出力を有効にする方法
こっちは普通の診断ログ

[XGEN] POP3 および IMAP4 のプロトコル ログ出力を有効にする方法
日本語訳に間違いあり。こっちはプロトコルログ(テキストファイル)

POP3 Protocol Log Path のデフォルトは C:\Program Files\Exchsrvr\mdbdata
POP3 Protocol Log Level は 0

サービスを再起動しなくてもレジストリに設定したらリアルタイムで反映。
ただし KB によるとログファイルはサービスが停止するまで掴んでいる。

追記

MS の Exchange PSS メンバによるブログ You Had Me At EHLO... より、プロトコルログの出力レベルについての記述。

Snap, crackle... IMAP! er... SMTP? er... HTTP! Aw, heck...

0・・・なし
1-3・・・だいたい一緒
4・・・メールデータを除くクライアントの動作ほとんど全部
5・・・全て

2004年01月16日

2004年01月15日

Exchange 2000 Server Standard Edition でデータベースサイズを一時的に増やす方法

Exchange 2000 Server で設定されている 16 GB のデータベース サイズの上限を一時的に増やす方法

今日見た限り、日本語版はレジストリ設定の記述が無いので英語版も書いておく。

How to Temporarily Increase the Exchange 2000 16-Gigabyte Database Size Limit

コメント

僕は TechNet のほうで見つけていたんですけど、そちらにはちゃんとレジストリの記載があるんですよね。
で、おや?と思って良く見ると・・・
http://support.microsoft.com/default.aspx?scid=kb;ja;828070
の方にはちゃんと書いてあります。
TechNet2月番に記載されているのもこの828070です。
だからこの813051は無意味なKBかと。

Posted by: いわさのぶひこ at 2004年03月04日 16:05

本当だ、Exchange Server 2003 についても明記してあるからこっちを参照するべきですね。

こういう重複した KB 数多ありますよね。起稿したルートが違うんだろうか。

Posted by: nakatani at 2004年03月04日 17:53

2004年01月05日

受信トレイが Inbox になる

Outlook でフォルダが英語表記になってしまった。


[XGEN] 英語表記のフォルダ名を日本語表記に変更する方法

Outlook 2002 以降を使用している場合には、/ResetFolderNames スイッチをつけて Outlook (日本語版) を起動することにより、フォルダ名を日本語に戻すことが可能です。
たとえば次のように入力します。
"C:\Program Files\Microsoft Office\Office10\Outlook.exe" /ResetFolderNames

これで簡単に直ってしまいました。う~ん、楽になったもんだ。

サーバ側で一気に直す方法がないものだろうか

追記

ま、どうでもいいですが。
[XADM] Outlook Todayの[メールボックス]部分が英語になる

初夢 - nightmare

昨夜寝ていたらとんでもない悪夢を見ました。
普段あんまり夢を覚えていないのに、起きたときにかなりはっきり覚えていました。
それでも大概忘れてしまうので、横になったまま何度も思い出しなおしてメモしました。
なぜこんな夢を見たんだろう。ちょっと前にゲームソフト SIREN のコマーシャルがあったが、あれを思い出すほど怖かった。
これが初夢って、いったいどんな年になるのだろうか?

-----------------------------------
夢の最初の方はあまりはっきりしません。
まず、僕が気になっている女性が居て、仮にAさんとしましょう。
Aさんは大学が同じわけでも何でもないのですが、なぜか僕の大学のクラブのOB会に所属している。そのAさんがOB会を辞めたいという相談をしてくる。
話をしてみると、OB会は確実に辞めるつもりということだ。(他に何を辞めるのかは不明)
その後、クラブの先輩のBさんがAさんのことで話しがあると電話で連絡してきた。
Bさんが家にやってきたが、予想外にOB達を数人連れて来た。
コタツを囲んで(学生のとき以来、コタツは使ってない)三々五々座りだすが、テレビのボリュームが下がらなくて、テレビそのもののリモコンを探す。(これには普段僕がビデオとテレビとアンプのリモコンを複数ガチャガチャ使い分けているという背景がある)
その間に、Bさん含めて何人か庭に出る。(住んでいるところに庭なんてないのに)
やっとテレビのリモコンを見つけて音量調節する。
テレビでは古いヒーロー番組の再放送をやっているようだ。
灰皿を使ったら後輩が自分の所に持って行ったりして、ちょっとムッとする。
コタツの自分の所に置いた灰皿が無くて、怒って庭に向かって「誰が灰皿を持っていった?」、と怒鳴る。庭では雨が降っている。
コタツに座っている後輩が、自分が座っているところに持っていったことに気づく。
後輩二人にキレて、二人とも帰れと言う。
そのままBさんも何の話も無く、みんな帰る。
庭に出ると、小学校から高校まで名古屋で住んでいた家の庭だと気づいて不思議に思う。
名古屋の家なら二階の様子を見ればわかるから、確認するために後で二階に上がろうと思う。
大雨が降っていて庭は水浸しになっているが、不思議と水は澄んでいて、サンダル履きのくるぶしより上まで水が溜まっている。
庭の様子は、芝生の色など昔のままとあまり変わってないが、少しくたびれてる感じがする。
ああ、ずいぶん水浸しになってしまってるから水はけをよくしなくてはと思う。
庭から上がるとき足拭きマットを探すが見つからないので、仕方なくそのままあがる。
庭に出る出窓のロックが三重になっていて感心してガチャガチャ試していると、変な二人組みが庭からこちらを窺っている。
なんですかと聞くと、電気料金を払ってください、と言われる。
電気料金を徴収しに人が来るようなことは無いと思い、怪しい奴らだと気がつく。
電気料金はちゃんと払ってる、警察を呼ぶぞと言いながら窓(庭への出口)をロックする。
怪しい奴らは、電話してみろよ出来るものならと応える。
警察に電話をかけようとすると、古いダイヤル式の電話で、110の1とダイヤルするのになぜか1回転余分に回してからでないと1のところに止まらない。
1回転させてからなら止まることがわかったのでそのまま続けて1・0とダイヤルする
玄関側でドアを開けようとしている音が聞こえてくる。電話がつながった。
「あの、変な二人組みが来て進入しようとしてるんです。えっと、ここは桶狭間の、イヤ、それは細かい住所なので後で言います。もしもし、そちらは名古屋市警ですか?」(本当はウナギハザマという地名なのだが、自分で勘違いしている)
ちょっと気になる間があって「はい、警察です」
「えっと、こちらの住所は名古屋市名東区・・・」
のどがかすれて一言一言を発音するのに異常なくらい苦労しながらしゃべる。
「桶狭間・・・」
警察が「ああ、もういいです」「・・・?」「全部死んでます」
全部死んでる? いったいどういうことだ?
住所を特定する必要がないくらいこの地域の人間は死んでしまってるって事か?
全部死んでるって俺も死んでるっていうことか?
俺は死んでるのに気づかずにこうして昔住んでた家に居るってことか????
声にならない声で力の限り悲鳴を上げる。(このとき多分、本当に叫んでたのだろう)
目の前が真っ暗になって、体が動かない。
どうやら自分が寝ていることに気がつくが、さっきからずっと意識が連続している。
のども実際にからからで声が出ない。
これは夢だったのかと気がつくが、同時に初夢であることにも気がつき、最悪な気分になる。
寝ているんだからこのまま再び寝てしまいたいと思うが、体中がものすごく寒気がして眠るに眠れない。
仕方なく起き上がるが、寒気はちっとも消えない。
-----------------------------------

ちゃんと色つきだったようだ。リモコンの電源スイッチの赤い色や、芝生の緑色はしっかりと印象に残っている。
誰か夢判断して(;_;)

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

叙々苑

今月は久しぶりに東京出張があるので、絶対 叙々苑 行くぞ!

コメント

叙々苑 もいいですが、港区麻布十番の一橋交差点そばの三幸園はもっといいです。
(昔その近くに住んでいたんですよ)

Posted by: いわさのぶひこ at 2004年03月04日 15:58

おほほ、初コメントありがとうございます。
(実はここは作り直したもので、その前は別の人からのコメントがありましたが、それもこの記事に反応してました。笑)

三幸園、行ってみます。
Summit 前泊のときかな?

Posted by: nakatani at 2004年03月04日 17:50

都内の食い放題一覧は、私の Blog みてください。(;´Д`)y─┛~~

Posted by: YamaKen at 2004年03月09日 02:12

都内の食い放題一覧は、私の Blog みてください。(;´Д`)y─┛~~

Posted by: YamaKen at 2004年03月09日 02:24

食い放題? 興味ナッシング。
焼肉に安さは求めてません。うはははは
一月に叙々苑(游玄亭)行ったときでも上から(特選カルビ・ロースから)注文する人達なので!

Posted by: nakatani at 2004年03月09日 10:36