2012年5月2日水曜日

ファイラーから呼び出すFireFileCopyをElevation Powertoysで昇格する

ファイラーから呼び出すFireFileCopyの昇格をコントロールする
前回の続き。
私の環境では、ファイル操作にFireFileCopyを使っている(あふから呼び出す)。
こいつも状況によって一般権限と昇格した権限を使い分ける必要がある。フォルダリダイレクションの対象になっているフォルダ(system32とかProgram Filesとか)の下にファイルをコピーする場合には、昇格した権限を使う必要があるからである。

そこで私が用意したのが、下記2つのスクリプト。
ffc.vbsは、一般権限でFireFileCopyを起動するためのスクリプト。
ファイルのコピー先(Toオプション)がリダイレクション対象であった場合は警告ダイアログを出すようになっている。
ffcElevate.vbsは、昇格した権限でFireFileCopyを起動するためのスクリプト。FireFileCopyは32bitアプリケーションなので、64bit OSでのSystem32のリダイレクトに対する考慮を入れてある。
(「毎回ffcElevate.vbsを使えばいいじゃん!」と思うかもしれないが、ファイルコピーのたびにUACのダイアログが出たらたまらん。)
' Launch FireFileCopy from Afxw
Dim args, arg, options
Dim ws
Dim system32, syswow64, programFiles, programFilesX86
Dim i
Dim confirm
Dim isWow64
options = Split("to,copy,move,sync,a,bg,cb,ed,-ed,ft,jb,kd,lg,md,min,ng,nk,nq,ov,s,sr,st,t,tXY,ts,ts,tp,mid,low,idle,wait1,wait2,wait3,vf,vfl,-vf,vn,wd,ys,?,go!,sel", ",")
Set args = WScript.Arguments
Set ws = CreateObject("WScript.Shell")
isWow64 = False

' If FFC.exe will run on wow64 and
' the destination("/to:" switch) is a VirtualStore
'  (%windir%\system32 or
'   %windir%\SysWOW64 or
'   "Program Files"or
'   "Program Files (x86)),
' show confirmation dialog.
If ws.ExpandEnvironmentStrings("%PROCESSOR_ARCHITEW6432%") _
 = "AMD64" or _
 ws.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") _
 = "AMD64" Then
 isWow64 = True
End If

If isWow64 Then
 system32 = ws.ExpandEnvironmentStrings("%windir%") & _
  "\System32"
 syswow64 = ws.ExpandEnvironmentStrings("%windir%") & _
  "\SysWOW64"
 programFiles = ws.ExpandEnvironmentStrings( _
  "%ProgramFiles%")
 programFilesX86 = ws.ExpandEnvironmentStrings( _
  "%ProgramFiles(x86)%")
 toFolder = args.Named.Item("to")

 If left(toFolder, len(system32)) = system32 Or _
  left(toFolder, len(syswow64)) = soswow64 Or _
  left(toFolder, len(programFiles)) = programFiles Or _
  left(toFolder, len(programFilesX86)) = programFilesX86 Then
  confirm = MsgBox( _
   "コピー先はVirtualStoreにリダイレクトされます。よろしいですか?", _
   49, "FireFileCopy 事前確認")
  If confirm = 2 Then
   WScript.Quit
  End If
 End If
End If

' unnamed arguments
For i = 0 To args.unnamed.length - 1
 arg1 = args.Unnamed.Item(i)
 If InStr(arg1, " ") > 0 Then
  arg1 = """" & arg1 & """"
 End If
 ' If FFC.exe will run on wow64,
 ' replace "system32" to "sysnative" in 'From' path.
 If isWow64 Then
  arg1 = Replace(arg1, "C:\Windows\System32", _
   "C:\Windows\sysnative")
 End If
 arg = arg & " " & arg1
Next

' named arguments
For i = 0 To UBound(options)
 If args.named.exists(options(i)) Then
  arg1 = args.Named.Item(options(i))
  If Len(arg1) > 0 Then
   If InStr(arg1, " ") > 0 Then
    arg1 = """" & arg1 & """"
   End If
   arg1 = ":" & arg1
  End If
  arg = arg & " /" & options(i) & arg1
 End If
Next

ws.Run "%APP%\FireFileCopy\FFC.exe" & arg, vbHide
' Launch FireFileCopy from Afxw with an Elevated user Token.

Dim args, arg, arg1, options
Dim ws
Dim cmdpath

cmdpath = "C:\Windows\System32"
options = Split("to,copy,move,sync,a,bg,cb,ed,-ed,ft,jb,kd,lg,md,min,ng,nk,nq,ov,s,sr,st,t,tXY,ts,ts,tp,mid,low,idle,wait1,wait2,wait3,vf,vfl,-vf,vn,wd,ys,?,go!,sel", ",")
Set args = WScript.Arguments

' unnamed arguments
For i = 0 To args.Unnamed.Length - 1
 arg1 = args.Unnamed.Item(i)
 If InStr(arg1, " ") > 0 Then
  arg1 = """" & arg1 & """"
 End If
 arg = arg & " " & arg1
Next

' named arguments
For i = 0 To UBound(options)
 If args.Named.Exists(options(i)) Then
  arg1 = args.Named.Item(options(i))
  If len(arg1) > 0 Then
   If InStr(arg1, " ") > 0 Then
    arg1 = """" & arg1 & """"
   End If
   arg1 = ":" & arg1
  End If
  arg = arg & " /" & options(i) & arg1
 End If
Next

Set ws = CreateObject("WScript.Shell")

' if this script is running on wow64,
' replace "system32" to "sysnative"
' because ffc.exe is a 32bit application.
If ws.ExpandEnvironmentStrings("%PROCESSOR_ARCHITEW6432%") _
 = "AMD64" Then
 cmdpath = "C:\Windows\sysnative"
 arg = Replace(arg, "C:\Windows\System32", _
  "C:\Windows\sysnative")
End If
If ws.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") _
 = "AMD64" Then
 arg = Replace(arg, "C:\Windows\System32", _
  "C:\Windows\sysnative")
End If

ws.Run cmdpath & _
 "\cmd.exe /c elevate.cmd %APP%\FireFileCopy\FFC.exe" & _
 arg, vbhide

0 コメント:

コメントを投稿