Office アドイン

[Office用アプリ]野良アプリのススメ

Office 用アプリの概要」にもある通り、Office用アプリを公開・配布するには下記4つの方法が用意されています。

・Office ストア – これはマイクロソフトが Office.com 上でホストおよび統制するパブリック マーケットプレースです。Office ストアでは、世界中の開発者が各自のカスタム Office ソリューションを公開および販売でき、エンド ユーザーや IT プロフェッショナルはそれらをダウンロードして個人または企業で使用できます。

・SharePoint の Office 用アプリ カタログ – 作業ウィンドウ アプリとコンテンツ アプリの場合、IT 部門でプライベート アプリ カタログを展開して、Office ストアと同様の方法によってアプリを取得できるしくみを構築できます。この新しいカタログと展開プラットフォームにより、IT 部門では効率化された方法を使用して、マネージ ユーザーに一元的な場所から Office および SharePoint 用アプリを配布できます。

・Exchange カタログ – メール アプリ用のプライベート カタログであり、そのカタログが存在する Exchange サーバーのユーザーが利用できます。このカタログにより、企業のメール アプリ (内部で作成されたアプリや、Office ストアで入手可能かつ企業用にライセンスされたアプリを含みます) の公開と管理が可能になります。

・ネットワーク共有フォルダーのアプリ カタログ – IT 部門と開発者は、作業ウィンドウ アプリやコンテンツ アプリを中央のネットワーク共有フォルダーに展開することもできます。この場合、マニフェスト ファイルの保存と管理はそのネットワーク共有フォルダーで行われます。ユーザーは、この共有フォルダーを信頼できるカタログとして指定することでアプリを取得できます。また、IT 部門では、レジストリ設定を使用してこの共有フォルダーを信頼できるカタログとして構成することもできます。

Office 用アプリの概要より

組織内ではSharePointやExchangeも利用できますが、一般的には作成したアプリを公開するのに「Office ストア」を使うことになるだろうと思います。
ただし、Office ストアでアプリを公開するためには、

  1. Office 用アプリの UX 設計ガイドライン」に従って画面設計をする。
  2. Office ストアに提出されたアプリの検証ポリシー」に沿ってアプリを開発する。
  3. [方法] Microsoft Seller Dashboard の販売者アカウントを作成または編集する」にあるようにMicrosoft 販売者ダッシュボードでアカウントの承認を受ける。
  4. [方法] アプリを Microsoft Seller Dashboard に追加する」にあるようにMicrosoft 販売者ダッシュボードに作成したアプリを登録する。
  5. Microsoftが行う検証・テストにパスする。

といった手順が必要になります。
(あくまでも個人的な感想になりますが)正直面倒くさいです。
ちょっとしたアプリを作って知り合いにちょっと使ってもらいたい、という場合でもいちいちOffice ストアに登録する必要があるというのはかなり煩わしいのではないでしょうか。

そこで私がお薦めしたいのが「Office用アプリ(apps for Office)の概要と開発方法」でも紹介している、共有フォルダーを利用する方法です。
この方法であればOffice ストアに登録することなくユーザーにアプリを利用してもらうことが可能です。

とはいえ、この方法だとOffice用アプリ(apps for Office)の概要と開発方法にも書いた通り、ユーザー側で共有フォルダーを用意してもらい、そのフォルダーのパスを信頼できるアプリ カタログに追加してもらう必要があるため(Office用アプリ(apps for Office)の概要と開発方法マニフェストファイルの準備“参照)、多少の手間が掛かります。
その手間を省くために考えたのが下記スクリプトです。

■ SetAfoTrustedCatalogs.vbs

'*********************************************************************
' [Office 2013]信頼できるアプリカタログのアドレス設定スクリプト
'   - 共有フォルダーの設定 -> アプリカタログのアドレス追加
'
' Author    : kinuasa
' Date      : 2013/01/24
' Version   : 1.00
'*********************************************************************

Option Explicit

Dim ShareName   '共有フォルダーの共有名
Dim UserNm      'ユーザー名
Dim FolderPath  'マニフェストファイルを保存するフォルダーパス
Const LocalAddress = "\\127.0.0.1\"

'Officeアプリケーション(Excel,Word,PowerPoint)が起動しているか簡易的にチェック
If ChkRunningOfficeApp() Then
  MsgBox "Officeアプリケーション(Excel,Word,PowerPoint)を終了してから再度実行してください。", vbExclamation + vbSystemModal
  WScript.Quit
End If

'共有フォルダー・信頼できるカタログ設定
ShareName = InputBox("共有フォルダーの共有名を入力してください。" & vbCrLf & vbCrLf & "例:[\\192.168.1.1\MyFolder]という共有フォルダーの場合[MyFolder]の部分が共有名になります。")
If Len(Trim(ShareName)) < 1 Then WScript.Quit
If ChkStr(ShareName) Then
  MsgBox "共有名に半角英数字以外を使用しないでください。" & vbCrLf & "処理を中止します。", vbExclamation + vbSystemModal
  WScript.Quit
End If
If IsSharedFolderExists(ShareName) Then
  MsgBox "共有名[" & ShareName & "]はすでに存在しています。" & vbCrLf & "別の共有名を指定してください。", vbExclamation + vbSystemModal
  WScript.Quit
End If
If IsUrlExists(LocalAddress & ShareName) Then
  MsgBox "すでに信頼できるカタログに[" & LocalAddress & ShareName & "]が設定されています。" & vbCrLf & "処理を中止します。", vbExclamation + vbSystemModal
  WScript.Quit
End If
FolderPath = GetFolderPath("マニフェストファイルを保存するフォルダーを選択してください。" & vbCrLf & "※ 選択したフォルダーは共有フォルダーになります。")
If Len(Trim(FolderPath)) < 1 Then WScript.Quit
UserNm = CreateObject("WScript.Network").UserName
SetSharedFolder ShareName, FolderPath, UserNm '共有フォルダー設定(制限ユーザー名:現在のユーザー)
SetCatalogLocation LocalAddress & ShareName

MsgBox "処理が終了しました。", vbInformation + vbSystemModal


Private Sub SetSharedFolder(ByVal ShareName, ByVal FolderPath, ByVal UserNm)
'共有フォルダー設定(制限ユーザー数:1)
  Dim com
  
  com = "share """ & ShareName & ChrW(61) & FolderPath & """ /grant:""" & UserNm & ",full"" /users:1"
  CreateObject("Shell.Application").ShellExecute "net", com, "", "runas"
End Sub

Private Sub SetCatalogLocation(ByVal url)
'信頼できるカタログのアドレス設定
  Dim guid
  Const KeyName = "HKCU\Software\Microsoft\Office\15.0\WEF\TrustedCatalogs\"
  
  guid = GetGUID()
  'MsgBox guid '確認用
  UncheckFlags
  With CreateObject("WScript.Shell")
    .RegWrite KeyName & guid & ChrW(92) & "Flags", 1, "REG_DWORD"
    .RegWrite KeyName & guid & ChrW(92) & "Id", guid, "REG_SZ"
    .RegWrite KeyName & guid & ChrW(92) & "Url", url, "REG_SZ"
  End With
End Sub

Private Sub UncheckFlags()
'[メニューに表示する]チェックを外す
  Dim reg
  Dim keys
  Dim rn, rt
  Dim v
  Dim i, j
  Const HKEY_CURRENT_USER = &H80000001
  Const SubKeyName = "Software\Microsoft\Office\15.0\WEF\TrustedCatalogs"
  
  Set reg = CreateObject("WbemScripting.SWbemLocator").ConnectServer(, "root\default").Get("StdRegProv")
  reg.EnumKey HKEY_CURRENT_USER, SubKeyName, keys
  If Not IsNull(keys) Then
    For i = LBound(keys) To UBound(keys)
      reg.EnumValues HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i), rn, rt
      For j = LBound(rn) To UBound(rn)
        If LCase(rn(j)) = "flags" Then
          reg.GetDWORDValue HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i), rn(j), v
          Select Case CLng(v)
            Case 1: reg.SetDWORDValue HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i), rn(j), 0
          End Select
          Exit For
        End If
      Next
    Next
  End If
End Sub

Private Function ChkRunningOfficeApp()
'Officeアプリケーションの起動チェック
  Dim ex, wd, pp
  Dim ret
  
  Set ex = Nothing: Set wd = Nothing: Set pp = Nothing: ret = False '初期化
  On Error Resume Next
  Set ex = GetObject(, "Excel.Application")
  Set wd = GetObject(, "Word.Application")
  Set pp = GetObject(, "PowerPoint.Application")
  On Error GoTo 0
  If Not ex Is Nothing Then ret = True
  If Not wd Is Nothing Then ret = True
  If Not pp Is Nothing Then ret = True
  ChkRunningOfficeApp = ret
End Function

Private Function ChkStr(ByVal Str)
'半角英数字チェック
  Dim ret
  
  ret = False '初期化
  With CreateObject("VBScript.RegExp")
    .IgnoreCase = True
    .Global = True
    .Pattern = "[^a-zA-Z0-9]"
    If .Test(Str) Then ret = True
  End With
  ChkStr = ret
End Function

Private Function GetFolderPath(ByVal DlgTitle)
'フォルダー選択
  Dim ret
  Dim f
  Const ssfDESKTOPDIRECTORY = &H10
  
  ret = "": Set f = Nothing '初期化
  With CreateObject("Shell.Application")
    Set f = .BrowseForFolder(0, DlgTitle, &H1 + &H10, .Namespace(ssfDESKTOPDIRECTORY).Self.Path)
    If Not f Is Nothing Then
      ret = f.Self.Path
      If Right(ret, 1) = ChrW(92) Then ret = Left(ret, Len(ret) - 1)
    End If
  End With
  GetFolderPath = ret
End Function

Private Function IsSharedFolderExists(ByVal ShareName)
'共有フォルダーがすでに存在しているかチェック
  Dim ret
  
  ret = False '初期化
  If CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery("Select * From Win32_Share Where Name = '" & ShareName & "'").Count > 0 Then ret = True
  IsSharedFolderExists = ret
End Function

Private Function IsUrlExists(ByVal url)
'レジストリーにすでにURLが登録されているかチェック
  Dim ret
  Dim reg
  Dim keys
  Dim rn, rt
  Dim v
  Dim i, j
  Const HKEY_CURRENT_USER = &H80000001
  Const SubKeyName = "Software\Microsoft\Office\15.0\WEF\TrustedCatalogs"
  
  ret = False '初期化
  Set reg = CreateObject("WbemScripting.SWbemLocator").ConnectServer(, "root\default").Get("StdRegProv")
  reg.EnumKey HKEY_CURRENT_USER, SubKeyName, keys
  If Not IsNull(keys) Then
    For i = LBound(keys) To UBound(keys)
      reg.EnumValues HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i), rn, rt
      For j = LBound(rn) To UBound(rn)
        If LCase(rn(j)) = "url" Then
          reg.GetStringValue HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i), rn(j), v
          If v = url Then
            ret = True
            Exit For
          End If
        End If
      Next
    Next
  End If
  IsUrlExists = ret
End Function

Private Function GetGUID()
'GUID生成
  GetGUID = ChrW(123) & Mid(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) & ChrW(125)
End Function

使い方は下記の通りで、上記スクリプトを実行するとPC内の指定したフォルダーを共有フォルダーにして、「信頼できるアプリ カタログ」に共有フォルダーのパスを追加します。

  1. 共有フォルダーの共有名を入力します(半角英数字のみ)。
  2. Office 用アプリのマニフェストファイルを保存するフォルダーを選択します(※ このフォルダーが共有フォルダーになります)。
  3. 共有フォルダー設定時にユーザー アカウント制御の警告が表示される場合があるので、「はい」ボタンをクリックして変更を許可します。
  4. Officeアプリケーションを起動してセキュリティセンターを開くと、「信頼できるアプリ カタログ」にスクリプトから設定した共有フォルダーが追加されていることが確認できます。

このスクリプトによりユーザー環境にマニフェストファイルを保存する、カタログフォルダーが用意できるので、アプリ開発者はマニフェストファイルをそのフォルダーに保存してもらうだけでアプリを使用してもらえるようになるわけです(もちろんアプリ本体となるファイルは別途Webサーバー上に必要になるわけですが…)。

具体的な動作は実際に動かしてみるのが一番分かりやすいので、私の方でサンプル用のマニフェストファイルを用意しました。

■ sample.xml

<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="TaskPaneApp">
  <Id>17c52bc6-b5a9-4196-a80a-0a87470a4fb5</Id>
  <Version>1.0</Version>
  <ProviderName>kinuasa</ProviderName>
  <DefaultLocale>ja-JP</DefaultLocale>
  <DisplayName DefaultValue="動作確認用Office用アプリ" />
  <Description DefaultValue="動作確認用のOffice 用アプリです。"/>
  <Capabilities>
    <Capability Name="Document" />
    <Capability Name="Workbook" />
    <Capability Name="Presentation" />
  </Capabilities>
  <DefaultSettings>
    <SourceLocation DefaultValue="http://afo.devel.jp/apps/sample.html" />
  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
</OfficeApp>

上記マニフェストファイルを”SetAfoTrustedCatalogs.vbs“で用意したカタログフォルダーに保存した後、Officeアプリケーション(Excel,Word,PowerPoint)を実行すると、挿入タブの「Office 用アプリ」から「動作確認用Office用アプリ」が挿入できるようになります。

以上のように、ここではOffice 用アプリの所謂”野良アプリ“を使用する方法について説明してきましたが、野良アプリはあくまでも野良、公式に認可・署名されたものではありませんので、その利用は自己責任で行う必要があります。

開発者側も、アプリを配布する際にはなるべくなら公式に用意された方法を用いた方が良いでしょう。
販売者登録やアプリの審査といった面倒な手間は掛かりますが、”Microsoftがテストして署名したアプリ“というお墨付きが得られるメリットは大きいものです。

私が今回紹介した方法は、アプリを配布するのにこういった方法もあるんじゃないかという、ニッチで隙間的な手法に過ぎませんが、どなたかのお役に立てれば幸いです。

ちなみに、信頼できるアプリ カタログに追加する”SetAfoTrustedCatalogs.vbs“ファイルとは逆にアプリカタログの登録とフォルダーの共有設定を解除する「DelAfoTrustedCatalogs.vbs」ファイルも下記リンクに用意しましたので合わせてご利用ください。

■ DelAfoTrustedCatalogs.vbs

'*********************************************************************
' [Office 2013]信頼できるアプリカタログのアドレス削除スクリプト
'   - 共有フォルダーの指定 -> アプリカタログからアドレス削除,
'                             フォルダーの共有設定解除
'
' Author    : kinuasa
' Date      : 2013/01/24
' Version   : 1.00
'*********************************************************************

Option Explicit

Dim FolderPath  'マニフェストファイルを保存するフォルダーパス
Dim tmp
Dim itms, itm
Const LocalAddress = "\\127.0.0.1\"

'Officeアプリケーション(Excel,Word,PowerPoint)が起動しているか簡易的にチェック
If ChkRunningOfficeApp() Then
  MsgBox "Officeアプリケーション(Excel,Word,PowerPoint)を終了してから再度実行してください。", vbExclamation + vbSystemModal
  WScript.Quit
End If

'信頼できるカタログの登録とフォルダーの共有設定を解除
FolderPath = GetFolderPath("マニフェストファイル保存用のフォルダーを選択してください。" & vbCrLf & "※ 選択したフォルダーが信頼できるカタログに登録されている場合はその登録とフォルダーの共有設定が解除されます。")
If Len(Trim(FolderPath)) < 1 Then WScript.Quit
tmp = Replace(FolderPath, ChrW(92), ChrW(92) & ChrW(92))
Set itms = CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery("Select * From Win32_Share Where Path = '" & tmp & "'")
If itms.Count > 0 Then
  For Each itm In itms
    DelCatalogUrl LocalAddress & itm.Name
    DelSharedFolder itm.Name
  Next
  MsgBox "信頼できるカタログの登録とフォルダーの共有設定を解除しました。", vbInformation + vbSystemModal
Else
  MsgBox "信頼できるカタログに登録されている共有フォルダーではありません。" & vbCrLf & "処理を中止します。", vbExclamation + vbSystemModal
End If


Private Sub DelCatalogUrl(ByVal url)
'信頼できるカタログにURLが登録されていればレジストリキーを削除
  Dim ret
  Dim reg
  Dim keys
  Dim rn, rt
  Dim v
  Dim i, j
  Const HKEY_CURRENT_USER = &H80000001
  Const SubKeyName = "Software\Microsoft\Office\15.0\WEF\TrustedCatalogs"
  
  ret = False '初期化
  Set reg = CreateObject("WbemScripting.SWbemLocator").ConnectServer(, "root\default").Get("StdRegProv")
  reg.EnumKey HKEY_CURRENT_USER, SubKeyName, keys
  If Not IsNull(keys) Then
    For i = LBound(keys) To UBound(keys)
      reg.EnumValues HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i), rn, rt
      For j = LBound(rn) To UBound(rn)
        If LCase(rn(j)) = "url" Then
          reg.GetStringValue HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i), rn(j), v
          If v = url Then
            reg.DeleteKey HKEY_CURRENT_USER, SubKeyName & ChrW(92) & keys(i)
            Exit Sub
          End If
        End If
      Next
    Next
  End If
End Sub

Private Sub DelSharedFolder(ByVal ShareName)
'フォルダーの共有設定解除
  Dim com
  
  com = "share """ & ShareName & """ /delete"
  CreateObject("Shell.Application").ShellExecute "net", com, "", "runas"
End Sub

Private Function ChkRunningOfficeApp()
'Officeアプリケーションの起動チェック
  Dim ex, wd, pp
  Dim ret
  
  Set ex = Nothing: Set wd = Nothing: Set pp = Nothing: ret = False '初期化
  On Error Resume Next
  Set ex = GetObject(, "Excel.Application")
  Set wd = GetObject(, "Word.Application")
  Set pp = GetObject(, "PowerPoint.Application")
  On Error GoTo 0
  If Not ex Is Nothing Then ret = True
  If Not wd Is Nothing Then ret = True
  If Not pp Is Nothing Then ret = True
  ChkRunningOfficeApp = ret
End Function

Private Function GetFolderPath(ByVal DlgTitle)
'フォルダー選択
  Dim ret
  Dim f
  Const ssfDESKTOPDIRECTORY = &H10
  
  ret = "": Set f = Nothing '初期化
  With CreateObject("Shell.Application")
    Set f = .BrowseForFolder(0, DlgTitle, &H1 + &H10, .Namespace(ssfDESKTOPDIRECTORY).Self.Path)
    If Not f Is Nothing Then
      ret = f.Self.Path
      If Right(ret, 1) = ChrW(92) Then ret = Left(ret, Len(ret) - 1)
    End If
  End With
  GetFolderPath = ret
End Function

コメント

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP