2014年2月10日月曜日

SubInACLのFlagとAccessMask早見表

dsp74118の補完庫: Windows のオブジェクトのアクセス権を操作するコマンド subinacl が便利だった で触れたSubInACLのFlag、AccessMaskの早見表を作った。
俺の中ではアクセス権変更ツールとしてのSubInACLはオワコンだが、現在のACLを確認するツールとしてはまだまだ便利に使えると思う。

パスをあふw(Afxw)で開く(File URI Scheme対応版)

引数で与えたパスをあふwで開くvbs。今日、少し手を加えたのでpostしておく。
元ネタは、何年も前にどこかから拾ったもの(2chのあふスレかな? ググったけど出てこなかった)。
あふwこまんど使用。
あふwこまんどは(というか、あふw自体が)ローカルパスとUNCパスは開けるけどfile URI Scheme(file:///)が開けなかったので、その考慮を付け加えたもの。
あふw 及び あふwこまんど のインストール先が"%APP%\afxw\"であることが動作条件。環境によって27~29行目を書き換えてもらえばよいかと思う。

Everythingの「規定のファイラーでパスを開く」に登録しておいたり、ブラウザやメーラーの"file:///"のコンテキストメニューに追加したりすると便利なんではないかと思う。
' Open with Afxw.vbs
' ver.1.1 dsp74118
' Description: Open path(Local path/UNC path/URI) with Afxw
' Requirement: あふこまんど(AFXWCMD.EXE) is installed in %APP%\afxw\
' args:
'  path string
Option Explicit

'Function UrlDecode
' Description: Decode UTF8-Encoded-URI
' args:
'  strSource: Encoded URI string
' return:
'  Decoded URI String
Function URLDecode(strSource)
 Dim objSC
 Set objSC = CreateObject("ScriptControl")
 objSC.Language = "Jscript"
 URLDecode = objSC.CodeObject.decodeURIComponent(strSource)
 Set objSC = Nothing
End Function

' main
On Error Resume Next
Dim wshShell
Dim app, afx, opt, quoteChar, SPC, YEN
Set wshShell = WScript.CreateObject("WScript.Shell")
app = wshShell.ExpandEnvironmentStrings("%APP%")
afx = app & "\afxw\AFXWCMD.EXE"
opt = "-p"
quoteChar = """"
Dim path, arg, runCmd
Set arg = WScript.Arguments
If arg.Count = 0 Then
 WScript.Quit
End If
path = arg(0)
' convert URI(file scheme) to UNC
If Left(path, 8) = "file:///" then
 path = Right(path, Len(path) - 8)
 path = URLDecode(path)
End If
runCmd = quoteChar & afx & quoteChar & " " & opt & quoteChar & path & quoteChar
wshShell.Run(runCmd)

2014年2月7日金曜日

PowerShellでNTFSのACLをいじる(備忘録レベル)

2014.2.13修正 ACLの適用範囲や継承は既存の設定を引き継ぐよう修正

仕事で下記スクリプトを作ったので記録として残しておく。
機能は、引数で与えたフォルダに対し、セキュリティグループ "domainname\groupprefix*" の「サブフォルダーとファイルの削除」権限を削除するというもの。
このスクリプトをベースに、色々と応用が効くはず。
$Path = $args[0]
$acl = Get-Acl $Path
$groupAccess = $acl.access | where {$_.IdentityReference -like "domainname\groupprefix*"}
if ($groupAccess){
    $Access = $groupAccess.IdentityReference

    "Modifying Permissions For $Access"
    $Permission = $groupAccess.FileSystemRights
    "Before: $Permission"
    $Permission = ($Permission -replace "DeleteSubdirectoriesAndFiles(, )*","") -replace ", $", ""
    "After: $Permission"
    $inherit = $groupAccess.InheritanceFlags
    $propagation = $groupAccess.PropagationFlags
    $AccessRule = New-Object system.security.AccessControl.FileSystemAccessRule($Access, $Permission, $inherit, $propagation, "Allow")

    $AccessModification = New-Object system.security.AccessControl.AccessControlModification
    $AccessModification.value__ = 2
    $Modification = $False
    $acl.ModifyAccessRule($AccessModification, $AccessRule, [ref]$Modification) | out-null
}
Set-Acl -aclobject $acl -Path $Path

VagrantでWindowsゲストのBoxを作成


前々からVagrantをいじりたくてうずうずしていた私。最近ようやく触る時間ができたので、Windows Server 2012 R2ゲストのBox自作に挑戦した。
最初は[Vagrant] WindowsServer2012R2のBoxを自作する #Vagrant_ja - NAVER まとめを参考にさせてもらっていたが、このまとめの作者であるk-kukitaさんから「今はvagrant-windows使ったほうがよい」とアドバイスを頂いたので、早速vagrant-windowsを試してみた。

必要な手順はvagrant-windows/README.md at master · WinRb/vagrant-windows · GitHubにほとんど書いてある。
なお、VagrantやVirtualBoxのセットアップは、この記事では省略する。

2013年12月26日木曜日

Exchange 2007 の3ノードクラスタで、2番目のメールボックスサーバーへのメールボックス作成に失敗する

昨日、Exchange 2007 の既知不具合を踏んだ。
今頃 Exchange 2007 の情報かい、という感じで需要ないと思われるが記録を残しておく。
3ノードクラスタの動作確認で問題発生
Exchange 2007のメールボックスサーバーの高可用性構成には "ローカル連続レプリケーション (lcr)", "クラスタ連続レプリケーション (ccr)", "スタンバイ連続レプリケーション (scr)", "シングルコピークラスタ (scc)" の4種類がある。
高可用性: Exchange 2007 ヘルプ
今回担当したシステムでは、昔ながらの共有ディスク構成である scc を選択。ベストの選択かどうかはともかく、ディスクサイズ節約という観点では、scc 以外の選択肢は無いので。
サイジングの結果、Active-Active-Passive の3ノード構成になった。
3ノードって滅多に無いので、この時点でやや不安ではあった。

で、メールボックスを新規作成する試験を実施したところ、見慣れぬエラーが発生。
サーバー <servername> 上のプロキシの生成プログラム DLL が見つからないか、初期化に失敗しました。現在の受信者のプロキシ アドレスを計算できません。すべてのプロキシ アドレス生成プログラム DLL が対象となるサーバーにインストールされていることを確認してください。
2007 の既知の不具合だった
調査したところ、すぐに下記の情報に行き着いた。
シングル コピー クラスタのインストール: Exchange 2007 ヘルプ
複数のクラスタ化メールボックス サーバーが存在する SCC では、フェールオーバー クラスタにインストールされている 2 番目以降のクラスタ化メールボックス サーバーに新しいメールボックスを作成できないという、既知の問題があります。
なんで既に枯れてる 2007 にこんなしょぼいバグが残ってるんだ。
その対処方法は下記ページに書かれている。
Exchange 2007 シングル コピー クラスタ (SCC) の 2 台目以降のクラスタ化メールボックス サーバー (CMS) 上でメールボックス作成を有効にする方法
このページによると、どうやら、AD内に本来自動的に作られるべき "Microsoft MTA" オブジェクトが、クラスタの2番目以降のサーバでは作られないので、手作業で作ってくれということのようである。さっきのエラーメッセージの「プロキシの生成プログラムDLL」って、全然関係ないじゃん。Microsoft 製品のエラーメッセージは相変わらずアレだ。

というわけで、上記ページの手順に従って Microsoft MTA オブジェクトを作成して本件は解決した。
今後 Exchange 2007 で3ノード以上の scc を組む人の参考になれば幸いである。そんな人いないか。

2013年12月24日火曜日

2013年12月13日金曜日

[VBA] Excelで簡易Diff

SIerにお勤めの社畜の皆さんこんにちは。社畜Excel職人のdsp74118です。
ご挨拶はさておき、今日の本題へ。
ExcelでDiffしたい
我々SIerの仕事は、1にExcel、2にExcel。3、4がWordで5にPowerPointであるから、Excelで行う作業を如何に効率化するかが、サボる業績を上げるための至上命題である。
さて、我々SIerは「2つのデータのDiffをExcelで見たい」というシチュエーションによく遭遇する。 Excelのブック同士のDiffを取るのであれば、WinMerge+xdocdiff プラグインとかを使えばよいのだが、当記事は、同一シート内の2つの列でDiffを取り、それを見やすく整形することをテーマとしている。
例えば下図Figure.1のような状況。
Figure.1 A列とC列を比較したい
A列とC列に似たようなデータが入っているが、微妙に違う。これのDiffを取る(SI業界では"突合"と言う)にあたり、Excel使いとして飼い慣らされた社畜であるならば、同一データを同一行に揃えたくなるだろう。
Figure.2 こういう風に同じデータが同一行に揃うと嬉しいよね
このような整形処理を実現するVBAをこの度書いたので、ここに公開する次第である。
Posted in