ファイル権限デザイナーで使用しているNet系APIについての解説

はじめに

ファイル権限デザイナーはC#で作成されていますが、ファイル権限の操作のところ .NETのライブラリーだけでは難しいので、重要な機能はAPIで作成されております。その一例を紹介します。

今回はNetAPI系を説明します。

ユーザを追加するときに、ユーザ一覧が必要ですが、まず、対象のファイルを管理している、PCがドメインコントローラか、スタンドアローンサーバか、ワークステーションか判断する必要があります。それにより、ドメインコントローラからユーザ一覧を取得したり、サーバローカルのユーザからユーザ一覧を取得したり制御しています。

ファイル権限デザイナーで使用しているNetAPIの一部

//NetUserChangePassword ユーザーのパスワードを変更 
//NetUserGetGroups ユーザーが属しているグローバルグループのリストを取得 
//NetUserGetInfo ユーザーアカウントに関する情報を取得 
//NetUserGetLocalGroups ユーザーが属しているローカルグループのリストを取得 
//NetUserSetGroups アカウントに対するグローバルなグループメンバの資格を設定 
//NetUserSetInfo ユーザーアカウントのパラメータを設定 
//NetUserModalsGet すべてのユーザーとグローバルなグループのグローバルな情報を取得 
//NetUserModalsSet すべてのユーザーとグローバルなグループのグローバルな情報を設定 

//NetLocalGroupAdd ローカルグループを作成 
//NetLocalGroupAddMembers ローカルグループに既存のアカウントまたはグローバルグループのメンバの資格を与える 
//NetLocalGroupDel ローカルグループアカウントとそのすべてのメンバを削除 
//NetLocalGroupDelMembers 特定のローカルグループからメンバを削除 
//NetLocalGroupEnum ローカルグループアカウントに関する情報を取得 //NetLocalGroupGetInfo サーバー上の特定のローカルグループアカウントに関する情報を取得 
//NetLocalGroupSetInfo ローカルグループアカウントのパラメータを設定 

//NetShareAdd
//NetShareDel
//NetShareEnum
//NetShareGetInfo
//NetShareSetInfo

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

using System.Collections;
using System.Collections.Generic;

namespace Cadree.Common.Object
{
    public class CaD_API_NetApi32
    {
        //--------------------------------------------------------------------------------------------------------------------
        // GetServerNameFromFQN
        //--------------------------------------------------------------------------------------------------------------------
        static private STRUCT_strServerName_Original GetServerNameFromFQN(string strFQN)
        {
            STRUCT_strServerName_Original strServerName_Original;
            strServerName_Original.value = "";
            if (strFQN != "")
            {
                if (strFQN.Substring(0, CAD_String.YENYEN.Length) == CAD_String.YENYEN)
                {
                    int nPos = strFQN.IndexOf(CAD_String.YEN, CAD_String.YENYEN.Length);
                    if (nPos == -1)
                    {
                        strServerName_Original.value = strFQN.Substring(CAD_String.YENYEN.Length);
                    }
                    else
                    {
                        strServerName_Original.value = strFQN.Substring(CAD_String.YENYEN.Length, nPos - CAD_String.YENYEN.Length);
                    }
                }
            }
            return strServerName_Original;
        }

        //---------------------------------------------------------------------------------------------------------------
        // IsThisPC_FullPath
        //---------------------------------------------------------------------------------------------------------------
        static public bool IsThisPC_FullPath(string strFullPath)
        {
            STRUCT_strServerName_Original  strServerName_Original = GetServerNameFromFullPah(strFullPath);
            if (String.Compare(strServerName_Original.value, CaD_Directory.GetThisPC_Machine_ShortName().value, true) == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        //---------------------------------------------------------------------------------------------------------------
        // GetNetSharePath
        //---------------------------------------------------------------------------------------------------------------
        public struct STRUCT_NetSharePath
        {
            public STRUCT_strServerName_Original strServerName_Original;
            public string strNetFullPath;
            public string strNetPath;
            public string strNetName;
        }

        public static STRUCT_NetSharePath GetNetSharePath(string strFullPath)
        {

            STRUCT_NetSharePath NetSharePath;

            {

                int nPos = strFullPath.IndexOf(CAD_String.CORON);
                if (nPos == -1)
                {
                    //ネットワーク名
                    int nPosYen = strFullPath.IndexOf(CAD_String.YEN, CAD_String.YENYEN.Length);
                    int nPosYenNext = strFullPath.IndexOf(CAD_String.YEN, nPosYen + CAD_String.YEN.Length);

                    if (nPosYenNext == -1)
                    {
                        //ここ絶対こないかもしれない。わからないのでおいておく。
                        NetSharePath.strNetPath = strFullPath;
                    }
                    else
                    {
                        NetSharePath.strNetPath = strFullPath.Substring(0, nPosYenNext);
                    }
                    //NetSharePath.strNetFullPath
                    NetSharePath.strNetFullPath = strFullPath;
                    //--------------------------------------------

                }
                else
                {
                    //ローカルドライブ
                    string strDriveName = strFullPath.Substring(0, nPos + 1);
                    string strFQN = CaD_API_Mpr.GetConnetctionFromDriveName(strDriveName);
                    if (strFQN == "")
                    {
                        //throw new Exception("GetNetSharePath; ローカルドライブなのに、この関数がよびだされました。");
                        NetSharePath.strNetPath = strDriveName; //ネットワークドライブでない。
                    }
                    else
                    {
                        NetSharePath.strNetPath = strFQN;
                    }

                    //NetSharePath.strNetFullPath
                    if (strFullPath.Length > (nPos + CAD_String.YEN.Length + 1))
                    {
                        NetSharePath.strNetFullPath = NetSharePath.strNetPath + CAD_String.YEN + strFullPath.Substring(nPos + CAD_String.YEN.Length + 1);
                    }
                    else
                    {
                        NetSharePath.strNetFullPath = NetSharePath.strNetPath;
                    }
                    //--------------------------------------------

                }

                //NetSharePath.strNetFullPath------------------
                //最後の\を削除する。(フォルダーはつけたらいいかもしれんが、とりあえず。下の関数IsRootShareFolderしかつかっていないのであんまりかんがえないではずしておく)
                //将来ほかでNetSharePath.strNetFullPathを使う場合にかんがえればよい。
                if (NetSharePath.strNetFullPath.Substring(NetSharePath.strNetFullPath.Length - 1) == CAD_String.YEN)
                {
                    NetSharePath.strNetFullPath = NetSharePath.strNetFullPath.Substring(0, NetSharePath.strNetFullPath.Length - 1);
                }
                //--------------------------------------------
            }

            {
                int nPos = NetSharePath.strNetPath.IndexOf(CAD_String.YEN, CAD_String.YENYEN.Length);
                NetSharePath.strNetName = NetSharePath.strNetPath.Substring(nPos + CAD_String.YEN.Length);
            }

            {
                NetSharePath.strServerName_Original.value = CaD_API_NetApi32.GetServerNameFromFullPah(strFullPath).value;
            }

            return NetSharePath;

        }

        //---------------------------------------------------------------------------------------------------------------
        // IsRootShareFolder 
        //---------------------------------------------------------------------------------------------------------------
        public static bool IsRootShareFolder(bool IsDirectory, string strFullPath)
        {
            if (IsDirectory)
            {
                CaD_API_NetApi32.STRUCT_NetSharePath NetSharePath = CaD_API_NetApi32.GetNetSharePath(strFullPath);

                if (NetSharePath.strNetFullPath.StartsWith(CAD_String.YENYEN))
                {
                    int nPos = NetSharePath.strNetFullPath.IndexOf(CAD_String.YEN, CAD_String.YENYEN.Length);
                    if (nPos == -1)
                    {
                        throw new Exception("Error; IsShareRoot; ありえない処理です。");
                    }

                    nPos = NetSharePath.strNetFullPath.IndexOf(CAD_String.YEN, nPos + 1);
                    if (nPos == -1)
                    {
                        //ルートです。
                        return true;
                    }
                }
            }
            return false;
        }

        //---------------------------------------------------------------------------------------------------------------
        // GetServerNameFromFullPah
        //---------------------------------------------------------------------------------------------------------------
        static public STRUCT_strServerName_Original GetServerNameFromFullPah(string strFullPath)
        {
            STRUCT_strServerName_Original strServerName_Original;
            strServerName_Original.value = "";

            int nPos = strFullPath.IndexOf(CAD_String.CORON);

            if (nPos == -1)
            {
                //ネットワーク名
                strServerName_Original = GetServerNameFromFQN(strFullPath);
            }
            else
            {
                //ローカルドライブ
                string strDriveName = strFullPath.Substring(0, nPos + 1);
                string strFQN = CaD_API_Mpr.GetConnetctionFromDriveName(strDriveName);
                if (strFQN == "")
                {
                    strServerName_Original.value = CaD_Directory.GetThisPC_Machine_ShortName().value;
                }
                else
                {
                    strServerName_Original = GetServerNameFromFQN(strFQN);
                }
            }
            return strServerName_Original;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // IsDomainControler
        //--------------------------------------------------------------------------------------------------------------------
        static public bool IsDomainControler(STRUCT_strServerName_Original strServerName_Original)
        {
            SERVER_INFO_101 serverInfo = GetServerInfo(strServerName_Original);

            if (
                   (((ServerType_Flags)serverInfo.Type & ServerType_Flags.SV_TYPE_DOMAIN_CTRL) == ServerType_Flags.SV_TYPE_DOMAIN_CTRL)
                   ||
                   (((ServerType_Flags)serverInfo.Type & ServerType_Flags.SV_TYPE_DOMAIN_BAKCTRL) == ServerType_Flags.SV_TYPE_DOMAIN_BAKCTRL)
               )
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        //--------------------------------------------------------------------------------------------------------------------
        // GetServerName_FixBuiltIn
        //--------------------------------------------------------------------------------------------------------------------
        static Hashtable m_htServerName_FixBuiltIn = null;

        static public STRUCT_strServerName_FixBuiltIn GetServerName_FixBuiltIn(STRUCT_strServerName_Original strServerName_Original)
        {
            if (m_htServerName_FixBuiltIn == null)
            {
                m_htServerName_FixBuiltIn = new Hashtable();
            }

            if (m_htServerName_FixBuiltIn.ContainsKey(strServerName_Original.value))
            {
                return (STRUCT_strServerName_FixBuiltIn)m_htServerName_FixBuiltIn[strServerName_Original.value];
            }

            STRUCT_strServerName_FixBuiltIn strServerName_FixBuiltIn;
            strServerName_FixBuiltIn.value = strServerName_Original.value;

            if (IsDomainControler(strServerName_Original))
            {
                //ドメインコントローラなら(PDC,BDC)
                DOMAIN_INFO domainInfo = GetDomainInfo(strServerName_Original.value);

                if (domainInfo.netJoinStatus == NetJoinStatus.NetSetupDomainName)
                {
                    strServerName_FixBuiltIn.value = domainInfo.strDomainOrWorkgroupName;
                }
                else if (domainInfo.netJoinStatus == NetJoinStatus.NetSetupWorkgroupName)
                {
                    //ドメインサーバに対して「ドメインに参加していないPC」か「ローカルログイン」した場合にここにくる。
                    //なにもしない
                }
            }
            else
            {
                //なにもしない
            }

            m_htServerName_FixBuiltIn[strServerName_Original.value] = strServerName_FixBuiltIn;
            return strServerName_FixBuiltIn;

        }
        //--------------------------------------------------------------------------------------------------------------------
        // GetServerName_FixBuiltIn_FromFullPath
        //--------------------------------------------------------------------------------------------------------------------
        static public STRUCT_strServerName_FixBuiltIn GetServerName_FixBuiltIn_FromFullPath(string strFullPath)
        {

            STRUCT_strServerName_Original strServerName_Original = GetServerNameFromFullPah(strFullPath);

            return GetServerName_FixBuiltIn(strServerName_Original);

        }

//Common
        //--------------------------------------------------------------------------------------------------------------------
        // APISuccess
        //--------------------------------------------------------------------------------------------------------------------
        // Win32 Result Code Constant
        private const int APISuccess = 0;

        //--------------------------------------------------------------------------------------------------------------------
        // NetApiBufferFree
        //--------------------------------------------------------------------------------------------------------------------
        [DllImport("netapi32", CharSet = CharSet.Auto)]
        private static extern int NetApiBufferFree([In] IntPtr lpBuffer);

//NetServerGetInfo サーバのプラットフォームを判別PDC,BDC

        //--------------------------------------------------------------------------------------------------------------------
        // NetServerGetInfo
        //--------------------------------------------------------------------------------------------------------------------
        [DllImport("Netapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int NetServerGetInfo(string serverName,int level,out IntPtr pSERVER_INFO_XXX);

        //--------------------------------------------------------------------------------------------------------------------
        // SERVER_INFO_101
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct SERVER_INFO_101
        {
            public int PlatformId;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string Name;
            public int VersionMajor;
            public int VersionMinor;
            public int Type;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string Comment;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // PlatformID
        //--------------------------------------------------------------------------------------------------------------------
        public enum PlatformID : uint
        {
            PLATFORM_ID_DOS = 300,
            PLATFORM_ID_OS2 = 400,
            PLATFORM_ID_NT = 500,
            PLATFORM_ID_OSF = 600,
            PLATFORM_ID_VMS = 700
        }
        //--------------------------------------------------------------------------------------------------------------------
        // ServerType
        //--------------------------------------------------------------------------------------------------------------------
        [Flags] //Flags 列挙体をビット・フィールドとして取り扱うには?http://www.atmarkit.co.jp/fdotnet/dotnettips/1052enumflags/enumflags.html
        public enum ServerType_Flags : uint
        {
            SV_TYPE_WORKSTATION = 0x00000001,   // すべてのワークステーション
            SV_TYPE_SERVER = 0x00000002,   // すべてのサーバー
            SV_TYPE_SQLSERVER = 0x00000004,   // すべてのMS SQL Server 
            SV_TYPE_DOMAIN_CTRL = 0x00000008,   // プライマリドメインコントローラ
            SV_TYPE_DOMAIN_BAKCTRL = 0x00000010,   // バックアップドメインコントローラ
            SV_TYPE_TIME_SOURCE = 0x00000020,   // Timesource サービスを実行しているサーバー
            SV_TYPE_AFP = 0x00000040,   // Apple File Protocol(AFP)サーバー
            SV_TYPE_NOVELL = 0x00000080,   // Novell サーバー
            SV_TYPE_DOMAIN_MEMBER = 0x00000100,   // LAN Manager 2.x のドメインメンバ
            SV_TYPE_PRINTQ_SERVER = 0x00000200,   // プリントキューを共有するサーバー
            SV_TYPE_DIALIN_SERVER = 0x00000400,   // ダイヤルインサービスを実行しているサーバー
            SV_TYPE_XENIX_SERVER = 0x00000800,   // Xenix サーバー
            SV_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER,   // 
            SV_TYPE_NT = 0x00001000,   // Windows NT/2000 のワークステーションまたはサーバー
            SV_TYPE_WFW = 0x00002000,   // Windows for Workgroups を実行しているサーバー
            SV_TYPE_SERVER_MFPN = 0x00004000,   // 
            SV_TYPE_SERVER_NT = 0x00008000,   // ドメインコントローラではない、Windows NT/2000 のサーバー
            SV_TYPE_POTENTIAL_BROWSER = 0x00010000,   // ブラウザサービスを実行できるサーバー
            SV_TYPE_BACKUP_BROWSER = 0x00020000,   // バックアップとしてブラウザサービスを実行しているサーバー
            SV_TYPE_MASTER_BROWSER = 0x00040000,   // マスタブラウザサービスを実行しているサーバー
            SV_TYPE_DOMAIN_MASTER = 0x00080000,   // ドメインマスタブラウザを実行しているサーバー
            SV_TYPE_SERVER_OSF = 0x00100000,   // 
            SV_TYPE_SERVER_VMS = 0x00200000,   // 
            SV_TYPE_WINDOWS = 0x00400000,   // Windows 95 以降
            SV_TYPE_DFS = 0x00800000,   // 
            SV_TYPE_CLUSTER_NT = 0x01000000,   // ドメイン内で利用できるサーバークラスタ
            SV_TYPE_TERMINALSERVER = 0x02000000,   // Terminal Server
            SV_TYPE_CLUSTER_VS_NT = 0x04000000,   // NT Cluster Virtual Server Name 
            SV_TYPE_DCE = 0x10000000,   // IBM DSS or equivalent 
            SV_TYPE_ALTERNATE_XPORT = 0x20000000,   // return list for alternate transport 
            SV_TYPE_LOCAL_LIST_ONLY = 0x40000000,   // Return local list only 
            SV_TYPE_DOMAIN_ENUM = 0x80000000,
            SV_TYPE_ALL = 0xFFFFFFFF    // すべてのサーバー
        }

        //--------------------------------------------------------------------------------------------------------------------
        // IsBeingServer
        //--------------------------------------------------------------------------------------------------------------------
        static public bool IsBeingServer(STRUCT_strServerName_Original strServerName_Original)
        {
            SERVER_INFO_101 serverInfo =  GetServerInfo(strServerName_Original);
            if (serverInfo.Type  != 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        //--------------------------------------------------------------------------------------------------------------------
        // GetServerInfo
        //--------------------------------------------------------------------------------------------------------------------
        static private SERVER_INFO_101 m_serverInfoOnError; //空
        private static Hashtable m_htServerInfo = null;

        //For Exsample         "SV001"        "192.168.20.16"
        static public SERVER_INFO_101 GetServerInfo(STRUCT_strServerName_Original strServerName_Original)
        {
            IntPtr pSI = IntPtr.Zero;
            try
            {
                if (m_htServerInfo == null)
                {
                    m_htServerInfo = new Hashtable();
                }

                if (m_htServerInfo.ContainsKey(strServerName_Original.value))
                {
                    return (SERVER_INFO_101)m_htServerInfo[strServerName_Original.value];
                }

                SERVER_INFO_101 serverInfo;
                if (NetServerGetInfo(strServerName_Original.value, 101, out pSI) == APISuccess)
                {
                    serverInfo = (SERVER_INFO_101)Marshal.PtrToStructure(pSI, typeof(SERVER_INFO_101));
                }
                else
                {
                    serverInfo =  m_serverInfoOnError;
                }

                m_htServerInfo[strServerName_Original.value] = serverInfo;
                return serverInfo;
            }
            finally
            {
                if (pSI != IntPtr.Zero) NetApiBufferFree(pSI);
            }
        }

//NetWkstaGetInfo  Workstation情報取得 (★使用しない。)

//        //--------------------------------------------------------------------------------------------------------------------
//        // WKSTA_INFO_100
//        //--------------------------------------------------------------------------------------------------------------------
//        [StructLayout(LayoutKind.Sequential, Pack = 4)]
//        struct WKSTA_INFO_100
//        {
//            public int wki100_platform_id;
//            public IntPtr wki100_computername;
//            public IntPtr wki100_langroup;
//            public int wki100_ver_major;
//            public int wki100_ver_minor;
//        }

//        //--------------------------------------------------------------------------------------------------------------------
//        // NetWkstaGetInfo
//        //--------------------------------------------------------------------------------------------------------------------
//        [DllImport("Netapi32.dll")]
//        private static extern int NetWkstaGetInfo(string servername, int level, out IntPtr bufptr);

//        //    NET_API_STATUS NetWkstaGetInfo(
//        //    LPWSTR servername,
//        //    DWORD level,
//        //    LPBYTE* bufptr
//        //    );

//        //--------------------------------------------------------------------------------------------------------------------
//        // GetWorkstationInfo
//        //--------------------------------------------------------------------------------------------------------------------
//        static private WKSTA_INFO_100 m_workstationInfoOnError; //空

//        static WKSTA_INFO_100 GetWorkstationInfo(string strWorkstationName)
//        {
//            IntPtr pWI = IntPtr.Zero;
//            WKSTA_INFO_100 workstationInfo;
//            workstationInfo.wki100_platform_id = 0; //なんかいれないとコンパイルエラーになる。

//            try
//            {
//                if (NetWkstaGetInfo(strWorkstationName, 100, out pWI) == APISuccess)
//                {
//                    return (WKSTA_INFO_100)Marshal.PtrToStructure(pWI, typeof(WKSTA_INFO_100));
//                }
//                else
//                {
//                    return m_workstationInfoOnError;
//                }
//            }
//            finally
//            {
//                if (pWI != IntPtr.Zero) NetApiBufferFree(pWI);
//            }
//        }

//NetGetJoinInformation ドメインかワークグループに参加しているのかを判別する。とドメイン名、ワークグループ名取得

        //--------------------------------------------------------------------------------------------------------------------
        // NetGetJoinInformation
        //--------------------------------------------------------------------------------------------------------------------
        [DllImport("Netapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int NetGetJoinInformation(string server, out IntPtr domain, out NetJoinStatus status);

        //--------------------------------------------------------------------------------------------------------------------
        // NetJoinStatus
        //--------------------------------------------------------------------------------------------------------------------
        // NetGetJoinInformation() Enumeration
        public enum NetJoinStatus
        {
            NetSetupUnknownStatus = 0,
            NetSetupUnjoined,
            NetSetupWorkgroupName,
            NetSetupDomainName
        } // NETSETUP_JOIN_STATUS

        //--------------------------------------------------------------------------------------------------------------------
        // DOMAIN_INFO
        //--------------------------------------------------------------------------------------------------------------------
        public struct DOMAIN_INFO
        {
            public NetJoinStatus netJoinStatus;
            public string strDomainOrWorkgroupName;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // GetDomainInfo
        //--------------------------------------------------------------------------------------------------------------------
        static private Hashtable htDomainInfo = null;

        public static DOMAIN_INFO  GetDomainInfo(string strWorkstationName)
        {
            if (htDomainInfo == null)
            {
                htDomainInfo = new Hashtable();
            }

            if (htDomainInfo.ContainsKey(strWorkstationName))
            {
                return (DOMAIN_INFO)htDomainInfo[strWorkstationName];
            }

            IntPtr pDomain = IntPtr.Zero;

            DOMAIN_INFO domainInfo;
            domainInfo.netJoinStatus = NetJoinStatus.NetSetupUnknownStatus;
            domainInfo.strDomainOrWorkgroupName= "";

            try
            {
                if (NetGetJoinInformation(strWorkstationName, out pDomain, out domainInfo.netJoinStatus) == APISuccess)
                {
                    if (domainInfo.netJoinStatus == NetJoinStatus.NetSetupDomainName || domainInfo.netJoinStatus == NetJoinStatus.NetSetupWorkgroupName)
                    {
                        domainInfo.strDomainOrWorkgroupName = Marshal.PtrToStringAuto(pDomain);
                    }
                }
                htDomainInfo[strWorkstationName] = domainInfo;

                return domainInfo;
            }
            finally
            {
                if (pDomain != IntPtr.Zero) NetApiBufferFree(pDomain);
            }
        }

        //---------------------------------------------------------------------------------------------------------------
        // IsJoinDomain_LocalMachine
        //---------------------------------------------------------------------------------------------------------------
        private static object objIsJoinDomain_ThisPC_Machine = null;

        public static bool IsJoinDomain_ThisPC_Machine
        {
            get
            {
                if (objIsJoinDomain_ThisPC_Machine == null)
                {
                    DOMAIN_INFO domain_info = GetDomainInfo(CaD_Directory.GetThisPC_Machine_ShortName().value);

                    objIsJoinDomain_ThisPC_Machine = domain_info.netJoinStatus == NetJoinStatus.NetSetupDomainName;

                }

                return (bool)objIsJoinDomain_ThisPC_Machine;

            }
        }

//NetUserGetGroups ローカルグループの取得
        //--------------------------------------------------------------------------------------------------------------------
        // NetLocalGroupGetMembers
        //--------------------------------------------------------------------------------------------------------------------
        [DllImport("NetAPI32.dll", CharSet = CharSet.Auto)]
        private extern static int NetLocalGroupGetMembers(
            [MarshalAs(UnmanagedType.LPWStr)] string servername,
            [MarshalAs(UnmanagedType.LPWStr)] string localgroupname,
            int level,
            out IntPtr bufptr,
            int prefmaxlen,
            out int entriesread,
            out int totalentries,
            ref int resume_handle);

        //--------------------------------------------------------------------------------------------------------------------
        // LOCALGROUP_MEMBERS_INFO_2
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct LOCALGROUP_MEMBERS_INFO_2
        {
            public IntPtr lgrmi2_sid;   //x64だとおちるので int-->intPtrに変更した。
            public int lgrmi2_sidusage;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string lgrmi2_domainandname;  //x64だとおちるので strubg-->intPtrに変更したが、[MarshalAs(UnmanagedType.LPWStr)]をいれたら大丈夫になった。
        }

        //--------------------------------------------------------------------------------------------------------------------
        // GetLocalGroupMembers
        //--------------------------------------------------------------------------------------------------------------------
        public static ArrayList GetLocalGroupMembers(STRUCT_strServerName_Original strServerName_Original, STRUCT_strNTAccount_ShortName strNTAccount_ShortName)
        {
            ArrayList arrayList = null;

            IntPtr nPtrBuffer = IntPtr.Zero;
            try
            {

                int nEntriesRead;
                int nTotalEntries;
                int nResume = 0;
                if (NetLocalGroupGetMembers(strServerName_Original.value, strNTAccount_ShortName.value, 2, out nPtrBuffer, -1, out nEntriesRead, out nTotalEntries, ref nResume) == APISuccess)
                {
                    if (nEntriesRead > 0)
                    {
                        LOCALGROUP_MEMBERS_INFO_2[] Members = new LOCALGROUP_MEMBERS_INFO_2[nEntriesRead];
                        arrayList = new ArrayList();

                        IntPtr iter = nPtrBuffer;

                        for (int i = 0; i < nEntriesRead; i++)
                        {
                            Members[i] = (LOCALGROUP_MEMBERS_INFO_2)Marshal.PtrToStructure(iter, typeof(LOCALGROUP_MEMBERS_INFO_2));
                            iter = (IntPtr)((int)iter + Marshal.SizeOf(typeof(LOCALGROUP_MEMBERS_INFO_2)));

                            ////x64だとおちるので strubg-->intPtrに変更したが、[MarshalAs(UnmanagedType.LPWStr)]をいれたら大丈夫になった。
                            //string strName = Marshal.PtrToStringAuto(Members[i].lgrmi2_domainandname);

                            //■これはユーザ管理での見た目と違い自動的にしてくれているので不要。
                            //string strTemp = Members[i].lgrmi2_domainandname;
                            //int nPos =strTemp.IndexOf(CAD_String.YEN);
                            //if(nPos==-1)
                            //{
                            //    //\マークないものはそのローカルユーザなのでサーバ名必要
                            //    strTemp = strServerName_Original.value  + CAD_String.YEN +   strTemp;
                            //}
                            //else
                            //{
                            //    if(nPos==0)
                            //    {
                            //        //頭に\マークがあれば、WellKnownのPrifixなしなので\マークのみはずす
                            //        strTemp = strTemp.Substring(CAD_String.YEN.Length);
                            //    }
                            //}

                            arrayList.Add(Members[i].lgrmi2_domainandname);
                        }
                    }
                }

            }
            finally
            {
                if (nPtrBuffer != IntPtr.Zero) NetApiBufferFree(nPtrBuffer);
            }

            return arrayList;

        }

        //--------------------------------------------------------------------------------------------------------------------
        // SampleGetLocalGroupMembers
        //--------------------------------------------------------------------------------------------------------------------

        static public void SampleGetLocalGroupMembers()
        {
            Console.WriteLine("Start SampleGetLocalGroupMembers");

            //Start SampleGetLocalGroupMembers
            //PC007\Administrator1
            //EXONE\Domain Admins2
            //EXONE\Domain Users2
            //PC007\test1
            //End SampleGetLocalGroupMembers

            ArrayList arrayList = new ArrayList();

            STRUCT_strServerName_Original strServerName_Original;
            strServerName_Original.value = "PC007";
            //arrayList = GetLocalGroupMembers(strServerName_Original, "administrators");
            ////string delimStr = ",";
            ////char[] delimiter = delimStr.ToCharArray();
            //foreach (string strTemp in arrayList)
            //{        
            //    //string[] split = null;
            //    //split = str.Split(delimiter);
            //    //Console.WriteLine(split[0] + split[1]);
            //    Console.WriteLine(strTemp);
            //}

            Console.WriteLine("End SampleGetLocalGroupMembers");
        }

//NetUserGetGroups グローバルグループの取得

        //--------------------------------------------------------------------------------------------------------------------
        // NetUserGetLocalGroups
        //--------------------------------------------------------------------------------------------------------------------
        [DllImport("Netapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private extern static int NetUserGetLocalGroups([MarshalAs(UnmanagedType.LPWStr)] string servername,
            [MarshalAs(UnmanagedType.LPWStr)] string username,
            int level,
            int flags,
            out IntPtr bufptr,
            int prefmaxlen,
            out int entriesread,
            out int totalentries);

        //--------------------------------------------------------------------------------------------------------------------
        // LOCALGROUP_USERS_INFO_0
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        internal struct LOCALGROUP_USERS_INFO_0
        {
            [MarshalAs(UnmanagedType.LPWStr)]
            internal string name;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // LOCALGROUP_USERS_INFO_1
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        internal struct LOCALGROUP_USERS_INFO_1
        {
            [MarshalAs(UnmanagedType.LPWStr)]
            public string name;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string comment;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // GetUserLocalGroups
        //--------------------------------------------------------------------------------------------------------------------
        static public ArrayList GetUserLocalGroups(STRUCT_strServerName_Original strServerName_Original, STRUCT_strNTAccount_ShortName strNTAccount_ShortName)
        {
            ArrayList arrayList = null;
            IntPtr nPtrBuffer = IntPtr.Zero;
            try
            {
                int nEntriesRead;
                int nTotalEntries;
                int nFlags = 0;

                if (NetUserGetLocalGroups(strServerName_Original.value, strNTAccount_ShortName.value, 0, nFlags, out nPtrBuffer, 1024, out nEntriesRead, out nTotalEntries) == APISuccess)
                {
                    if (nFlags > 1)
                    {
                        throw new Exception("Flags can only be 0 or 1");
                    }

                    if (nEntriesRead > 0)
                    {
                        LOCALGROUP_USERS_INFO_0[] RetGroups = new LOCALGROUP_USERS_INFO_0[nEntriesRead];
                        IntPtr nPtr = nPtrBuffer;

                        arrayList = new ArrayList();

                        for (int i = 0; i < nEntriesRead; i++)
                        {
                            RetGroups[i] = (LOCALGROUP_USERS_INFO_0)Marshal.PtrToStructure(nPtr, typeof(LOCALGROUP_USERS_INFO_0));
                            nPtr = (IntPtr)((int)nPtr + Marshal.SizeOf(typeof(LOCALGROUP_USERS_INFO_0)));
                            //ローカルのユーザはローカルグループしかわりあたらないので、頭に必ずサーバー名が必要
                            arrayList.Add(strServerName_Original.value + CAD_String.YEN + RetGroups[i].name);
                        }
                    }
                }
            }
            finally
            {
                if (nPtrBuffer != IntPtr.Zero) NetApiBufferFree(nPtrBuffer);
            }

            return arrayList;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // GetUserLocalGroups
        //--------------------------------------------------------------------------------------------------------------------
        static public void SampleGetUserLocalGroups()
        {

            //Start SampleGetUserLocalGroups
            //Administrators
            //End SampleGetUserLocalGroups
            //Console.WriteLine("Start SampleGetUserLocalGroups");

            //Hashtable RetGroups = new Hashtable();
            //STRUCT_strServerName_Original strServerName_Original;
            //strServerName_Original.value = "PC007";
            //RetGroups = GetUserLocalGroups(strServerName_Original, "administrator");
            //Console.WriteLine("End SampleGetUserLocalGroups");
        }

//NetUserGetGroups ローカルグループの取得
        //これはない。ローカルでネットワークなんか追加できんからなんにつかうんだろう。
        ////--------------------------------------------------------------------------------------------------------------------
        //// NetUserGetGroups
        ////--------------------------------------------------------------------------------------------------------------------
        //[DllImport("Netapi32.dll", SetLastError = true)]
        //public extern static int NetUserGetGroups
        //    ([MarshalAs(UnmanagedType.LPWStr)] string servername,
        //     [MarshalAs(UnmanagedType.LPWStr)] string username,
        //     int level,
        //     out IntPtr bufptr,
        //     int prefmaxlen,
        //     out int entriesread,
        //     out int totalentries);

        //--------------------------------------------------------------------------------------------------------------------
        // GetUserNetGroups
        //--------------------------------------------------------------------------------------------------------------------
        //static private int ErrorCode;
        //static private string _ErrorMessage;

        //static public string ErrorMessage {
        //    get { return _ErrorMessage; }
        //}

        //static public ArrayList GetUserNetGroups(string ServerName,string Username, int Flags)
        //{
        //    ArrayList myList = new ArrayList();
        //    int EntriesRead;
        //    int TotalEntries;
        //    IntPtr bufPtr;

        //    ErrorCode = NetUserGetGroups(ServerName,Username,Flags,out bufPtr,1024,out EntriesRead, out TotalEntries);
        //    if(ErrorCode==0)
        //    {
        //        _ErrorMessage="Successful";
        //    }
        //    else
        //    {
        //        _ErrorMessage="Username or computer not found";
        //    }
        //
        //    if (nFlags > 1)
        //        _ErrorMessage = "Flags can only be 0 or 1";
        //    if (nEntriesRead > 0)
        //    {
        //        LOCALGROUP_USERS_INFO_0[] RetGroups = new LOCALGROUP_USERS_INFO_0[EntriesRead];
        //        IntPtr iter = bufPtr;
        //        for (int i = 0; i < EntriesRead; i++)
        //        {
        //            RetGroups[i] = (LOCALGROUP_USERS_INFO_0)Marshal.PtrToStructure(iter, typeof(LOCALGROUP_USERS_INFO_0));
        //            iter = (IntPtr)((int)iter + Marshal.SizeOf(typeof(LOCALGROUP_USERS_INFO_0)));
        //            myList.Add(RetGroups[i].name);
        //        }
        //        NetApiBufferFree(bufPtr);
        //    }
        //    return myList;
        //}

        ////--------------------------------------------------------------------------------------------------------------------
        //// Sample_GetUserNetGroups
        ////--------------------------------------------------------------------------------------------------------------------
        //public static void Sample_GetUserNetGroups()
        //{
        //    //Start Sample_GetUserNetGroups
        //    //なし
        //    //End Sample_GetUserNetGroups

        //    Console.WriteLine("Start Sample_GetUserNetGroups");
        //    //Example code for calling application
        //    ArrayList RetGroups = new ArrayList();
        //    RetGroups = GetUserNetGroups("PC007", "administrator", 0);
        //    foreach (string str in RetGroups)
        //    {
        //        Console.WriteLine(str);
        //    }

        //    Console.WriteLine("End Sample_GetUserNetGroups");
        //}

//NetShareEnum サーバの共有一覧
        //--------------------------------------------------------------------------------------------------------------------
        // NetShareEnum
        //--------------------------------------------------------------------------------------------------------------------
        [DllImport("Netapi32.dll", CharSet = CharSet.Auto)]
        private static extern int NetShareEnum(
             StringBuilder ServerName,
             int level,
             ref IntPtr bufPtr,
             uint prefmaxlen,
             ref int entriesread,
             ref int totalentries,
             ref int resume_handle
             );

        //--------------------------------------------------------------------------------------------------------------------
        // Variable
        //--------------------------------------------------------------------------------------------------------------------
        private const uint MAX_PREFERRED_LENGTH = 0xFFFFFFFF;
        private const int NERR_Success = 0;

        //--------------------------------------------------------------------------------------------------------------------
        // NetError 
        //--------------------------------------------------------------------------------------------------------------------
        private enum NetError : uint
        {
            NERR_Success = 0,
            NERR_BASE = 2100,
            NERR_UnknownDevDir = (NERR_BASE + 16),
            NERR_DuplicateShare = (NERR_BASE + 18),
            NERR_BufTooSmall = (NERR_BASE + 23),
        }
        //--------------------------------------------------------------------------------------------------------------------
        // SHARE_TYPE
        //--------------------------------------------------------------------------------------------------------------------
        public enum SHARE_TYPE : uint
        {
            STYPE_DISKTREE = 0,
            STYPE_PRINTQ = 1,
            STYPE_DEVICE = 2,
            STYPE_IPC = 3,
            STYPE_SPECIAL = 0x80000000,
        }

        //--------------------------------------------------------------------------------------------------------------------
        // SHARE_INFO_0
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct SHARE_INFO_0
        {
            public string shi0_netname;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // SHARE_INFO_1
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct SHARE_INFO_1
        {
            public string shi1_netname;
            public uint shi1_type;
            public string shi1_remark;
            public SHARE_INFO_1(string sharename, uint sharetype, string remark)
            {
                this.shi1_netname = sharename;
                this.shi1_type = sharetype;
                this.shi1_remark = remark;
            }
            public override string ToString()
            {
                return shi1_netname;
            }
        }

        //--------------------------------------------------------------------------------------------------------------------
        // EnumNetShares
        //--------------------------------------------------------------------------------------------------------------------
        static public SHARE_INFO_1[] EnumNetShares(STRUCT_strServerName_Original strServerName_Original)
        {
            List<SHARE_INFO_1> ShareInfos = null;
            IntPtr nPtrBuffer = IntPtr.Zero;
            try
            {
                int nEntriesRead = 0;
                int nTotalEntries = 0;
                int nResume_handle = 0;
                int nStructSize = Marshal.SizeOf(typeof(SHARE_INFO_1));

                StringBuilder server = new StringBuilder(strServerName_Original.value);
                int ret = NetShareEnum(server, 1, ref nPtrBuffer, MAX_PREFERRED_LENGTH, ref nEntriesRead, ref nTotalEntries, ref nResume_handle);
                if (ret == NERR_Success)
                {
                    IntPtr currentPtr = nPtrBuffer;
                    for (int i = 0; i < nEntriesRead; i++)
                    {
                        SHARE_INFO_1 shi1 = (SHARE_INFO_1)Marshal.PtrToStructure(currentPtr, typeof(SHARE_INFO_1));

                        if (ShareInfos == null)
                        {
                            ShareInfos = new List<SHARE_INFO_1>();
                        }

                        ShareInfos.Add(shi1);
                        currentPtr = new IntPtr(currentPtr.ToInt32() + nStructSize);
                    }
                }
                else
                {
                    ShareInfos.Add(new SHARE_INFO_1("ERROR=" + ret.ToString(), 10, string.Empty));
                }
            }
            finally
            {
                if (nPtrBuffer != IntPtr.Zero) NetApiBufferFree(nPtrBuffer);
            }
            if (ShareInfos == null)
            {
                return null;
            }
            else
            {
                return ShareInfos.ToArray();
            }
        }

//NetShareGetInfo

        //--------------------------------------------------------------------------------------------------------------------
        // NetShareGetInfo
        //--------------------------------------------------------------------------------------------------------------------
        [DllImport("Netapi32", CharSet = CharSet.Auto)]
        private static extern int NetShareGetInfo(
            [MarshalAs(UnmanagedType.LPWStr)] string servername,
            [MarshalAs(UnmanagedType.LPWStr)] string netname,
            NetShareGetInfoLevel level,
            out IntPtr bufptr);

        //--------------------------------------------------------------------------------------------------------------------
        // NetShareGetInfoLevel
        //--------------------------------------------------------------------------------------------------------------------
        private enum NetShareGetInfoLevel
        {
            LEVEL_0 = 0,
            LEVEL_1 = 1,
            LEVEL_2 = 2,
            LEVEL_50 = 50,
            LEVEL_501 = 501,
            LEVEL_502 = 502,
            LEVEL_1005 = 1005,

        }

        //--------------------------------------------------------------------------------------------------------------------
        // SHARE_INFO_2
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct SHARE_INFO_2
        {
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi2_netname;
            public uint shi2_type;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi2_remark;
            public uint shi2_permissions;
            public uint shi2_max_uses;
            public uint shi2_current_uses;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi2_path;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi2_passwd;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // SHARE_INFO_502
        //--------------------------------------------------------------------------------------------------------------------
        [StructLayout(LayoutKind.Sequential)]
        struct SHARE_INFO_502
        {
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi502_netname;
            public uint shi502_type;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi502_remark;
            public Int32 shi502_permissions;
            public Int32 shi502_max_uses;
            public Int32 shi502_current_uses;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string shi502_path;
            public IntPtr shi502_passwd;
            public Int32 shi502_reserved;
            public IntPtr shi502_security_descriptor;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // ERROR_CODE for ShareInfo
        //--------------------------------------------------------------------------------------------------------------------
        const int ERROR_ACCESS_DENIED = 5;
        const int ERROR_INVALID_LEVEL = 124; // unimplemented level for info
        const int ERROR_INVALID_PARAMETER = 87;
        const int ERROR_MORE_DATA = 234;
        const int ERROR_NOT_ENOUGH_MEMORY = 8;
        const int NERR_BufTooSmall = 2123; // The API return buffer is too small.
        const int NERR_NetNameNotFound = 2310; // This shared resource does not exist.

        //--------------------------------------------------------------------------------------------------------------------
        // FormatMessageShareInfo
        //--------------------------------------------------------------------------------------------------------------------
        static string NetShareGetInfo_FormatMessage(int errCode)
        {
            switch (errCode)
            {
                case ERROR_ACCESS_DENIED: return "The user does not have access to the requested information.";
                case ERROR_INVALID_LEVEL: return "The value specified for the level parameter is invalid.";
                case ERROR_INVALID_PARAMETER: return "The specified parameter is invalid.";
                case ERROR_MORE_DATA: return "More entries are available. Specify a large enough buffer to receive all entries.";
                case ERROR_NOT_ENOUGH_MEMORY: return "Insufficient memory is available.";
                case NERR_BufTooSmall: return "The supplied buffer is too small.";
                case NERR_NetNameNotFound: return "The share name does not exist.";
            };

            return null;
        }

        //--------------------------------------------------------------------------------------------------------------------
        // NetShareGetInfo_Path
        //--------------------------------------------------------------------------------------------------------------------
        public static string NetShareGetInfo_Path(STRUCT_strServerName_Original strServerName_Original, string strShareName)
        {
            IntPtr nPtrBuffer = IntPtr.Zero;

            try
            {
                string strPath = null;
                int errCode = NetShareGetInfo(strServerName_Original.value, strShareName, NetShareGetInfoLevel.LEVEL_2, out nPtrBuffer);
                if (errCode == NERR_Success)
                {
                    SHARE_INFO_2 shareInfo = (SHARE_INFO_2)Marshal.PtrToStructure(nPtrBuffer, typeof(SHARE_INFO_2));
                    strPath = shareInfo.shi2_path;
                }
                else
                {
                    //Console.WriteLine(NetShareGetInfo_FormatMessage(errCode));
                }

                return strPath;
            }
            finally
            {
                if (nPtrBuffer != IntPtr.Zero) NetApiBufferFree(nPtrBuffer);
            }

        }

        //--------------------------------------------------------------------------------------------------------------------
        // NetShareGetInfo_DACL
        //--------------------------------------------------------------------------------------------------------------------
        //Administrators または Account Operators ローカルグループのメンバ、
        //あるいは Communication Operators、Print Operators、Server Operators 
        //のいずれかのグループのメンバだけがレベル 2(502含む) を指定してこの関数を実行できます。
        //レベル 0 またはレベル 1 を指定して実行する場合、特別なグループメンバーシップは必要ありません。

        //・9x系(98, ME等)
        //レベル1: 共有名、種類、コメント
        //レベル50: 共有名、種類、アクセス権、コメント、パス、パスワード、書込パスワード、読取パスワード

        //・NT系(XP, Vista等)
        //レベル0: 共有名
        //レベル1: 共有名、種類、コメント
        //レベル2: 共有名、種類、アクセス許可、最大接続数、現接続数、パス、パスワード
        //レベル501: 共有名、種類、コメント
        //レベル502: 共有名、種類、アクセス許可、最大接続数、現接続数、パス、パスワード、セキュリティ記述子
        //レベル503: 共有名、種類、アクセス許可、最大接続数、現接続数、パス、パスワード、サーバー名、セキュリティ記述子
        //レベル1004: コメント
        //レベル1005: DFSルート内のDFSリンクか否か
        //レベル1005: 最大接続数
        //レベル1501: セキュリティ記述子
        public const string NETSHAREGETINFO_DACL_ISNULL = "①「Administrators または Account Operators ローカルグループのメンバ、あるいは Communication Operators、Print Operators、Server Operators のいずれかのグループのメンバだけが共有情報を参照できます。」②「 Windows XP, Vista等の簡易ネットワーク共有の場合は権限が表示できません。」";

        static public CaD_API_Advapi32.STRUCT_ACE[] NetShareGetInfo_DACL(STRUCT_strServerName_Original strServerName_Original, string strShareName)
        {
            IntPtr nPtrBuffer = IntPtr.Zero;

            try
            {
                int ret = NetShareGetInfo(strServerName_Original.value, strShareName, NetShareGetInfoLevel.LEVEL_502, out nPtrBuffer);
                if (ret == NERR_Success)
                {
                    SHARE_INFO_502 shareInfo = (SHARE_INFO_502)Marshal.PtrToStructure(nPtrBuffer, typeof(SHARE_INFO_502));
                    try
                    {
                        return CaD_API_Advapi32.GetDACL_ACEs(shareInfo.shi502_security_descriptor);
                    }
                    catch
                    {
                        //エラーの場合はとりあえずNullで返す。
                        return null;
                    }
                    finally
                    {
                        //502初期化(★これはいらんだろう、やると逆にやばい?)
                        //if (shareInfo.shi502_security_descriptor != IntPtr.Zero) CaD_API_Kernel32.LocalFree(shareInfo.shi502_security_descriptor);
                        //if (shareInfo.shi502_passwd != IntPtr.Zero) CaD_API_Kernel32.LocalFree(shareInfo.shi502_passwd);
                    }
                }
                else
                {
                    //なかったらNullでかえす。
                    return null;
                }
            }
            finally
            {
               if (nPtrBuffer != IntPtr.Zero) NetApiBufferFree(nPtrBuffer);
            }
        }
        //--------------------------------------------------------------------------------------------------------------------
        // NetShareGetInfo1
        //--------------------------------------------------------------------------------------------------------------------
        static public int NetShareGetInfo1(string strServerName, string strShareName, ref SHARE_INFO_1 shareInfo)
        {
            IntPtr nPtrBuffer = IntPtr.Zero;

            try
            {
                int ret = NetShareGetInfo(strServerName, strShareName, NetShareGetInfoLevel.LEVEL_1, out nPtrBuffer);
                if (ret == NERR_Success)
                {
                    shareInfo = (SHARE_INFO_1)Marshal.PtrToStructure(nPtrBuffer, typeof(SHARE_INFO_1));
                }
                return ret;
            }
            finally
            {
                if (nPtrBuffer != IntPtr.Zero) NetApiBufferFree(nPtrBuffer);
            }

        }

    }
}

Office 用アプリ(Apps for Office)でデモアプリを作る -ログイン編(コンテンツアプリ)-

はじめに

「Office用アプリ(Excel)」から、「Webサーバ(IIS)」にアクセス時のセッション情報の扱いについて調査しました。 下記の図のように、Book内の複数の「オフィス用アプリ」から「Webサーバ(IIS)」にアクセス時でも同一セッションを使用していることが確認できました。 ※Bookが異なる場合は別のセッションになります。

apps_for_office_session_01

手順

とりあえずシンプルなログイン機能を実装して、 Session 情報が Book 間、Sheet 間で共有されるか否か検証してみた。

前回の内容

Office 用アプリ(Apps for Office)でデモアプリを作る -Webサービス編(コンテンツアプリ)-

2-1) ASP.net のフォーム認証機能を実装する

 

ASP.net のフォーム認証のように、コンテンツに表示したい。

apps_for_office_login_01

ASP.net のフォーム認証を試したのだが、何故か「×」が表示されたw

apps_for_office_login

2-2) ログイン(Login)機能を実装する

前回のプロジェクトに以下の項目を追加します。 1. 「追加」 → 「新しい項目」 → 「Visual C#」 → 「Web」 → 「グローバル アプリケーション クラス」を選択 global.asax 2. 「追加」 → 「新しい項目」 → 「Visual C#」 → 「Web」 → 「Web フォーム」を選択 login.aspx こんなかんじになります。

apps_for_office_session_05

コードはセキュリティの関係上、公開できませんがログインしたユーザー情報を Session に格納するといったシンプルなコードにしました。 デバック(F5)実行すると、コンテンツにログイン(login.aspx)が表示される。 Session 情報が無い場合はこのようになるように、global.asax に定義しています。

apps_for_office_session_02

ログインすると、コンテンツ内が Test.aspx に変わり、Session にKeep させたユーザー情報が表示されたのがわかる。

apps_for_office_session_03

同一 Book 内で、異なる Sheet へ同一のコンテンツを配置したら Session 情報がどうなるのか検証した。 同じSession 情報が表示されたので、同一 Session であることがわかる。 apps_for_office_session_03b

同一 Book 内であれば、Session 情報は共有できるようだ。 今度は、新規に別の Book を作成して、同じコンテンツを配置して Session 情報がどうなるのか検証した。 何も表示されていないので、異なるSession であることがわかる。

apps_for_office_session_04

異なる Book 間では、Session は共有できないようだ。 ログインして表示の切り替え等も確認できたので、 次回は、DBへ接続してデータを抽出してみます。

Office 用アプリ(Apps for Office)でデモアプリを作る -Webサービス編(コンテンツアプリ)-

はじめに

弊社で企画中の Office用 アプリ(Apps for Office)のサンプル版を作成するために、検証サンプルプログラムを作成しています。

今回は以下のコンテンツパネルからWebService(HTTP)経由でデータベースのデータを取得・設定できるようになります。

app_for_office_webservice_02

手順

前提

  1. Excel 2013だけではなく、Excel Web App の両方で動作させるため、作業ウインドウアプリではなく、コンテンツ アプリで作成する必要があります。
  2. Server は、Windows Azure (Web Server、DB Server)を使用します。(Azureでなくても可能)
  3. クロスドメイン(Cross-Dmain)対応しなくてはいけません。(後で詳しくかきます)

データのやりとりがしたいので、Web サービス(Web Service)を使っていきます。
まだ慣れていないので、順序立ててやっていきます。

1) Office 用アプリ(Apps for Office)に、Web サービスを組み込む

1. Office 2013 用アプリのプロジェクトを作成します

2. Web サービス(Web Service)を追加する
プロジェクト上で右クリックして、「追加」 → 「新しい項目」 → 「Visual C#」 → 「Web」 → 「Web サービス」を選択

3. Web フォーム(Web Form)を追加する
プロジェクト上で右クリックして、「追加」 → 「新しい項目」 → 「Visual C#」 → 「Web」 → 「Web フォーム」を選択

ひととおり追加したら、こんなかんじになる
app_for_office_webservice_04

・OfficeAppWebService.html (Web フォームを使うため、使用しない)
・Test.aspx (追加した Web フォーム)
・WebService1.asmx (追加した Web サービス)

Web フォームに「ScriptManager」を追加して、プロパティから「Service」を選択します。
メンバーを追加して、「Path」項目を、「Web サービス」のファイルを設定します。
app_for_office_webservice_01

【マニフェストファイル : OfficeAppWebService.xml】

<?xml version="1.0" encoding="UTF-8"?>
<!--Created:cb85b80c-f585-40ff-8bfc-12ff4d0e34a9-->
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ContentApp">
  <Id>a44000b8-0478-468e-9046-4fe25a4c383c</Id>
  <Version>1.0</Version>
  <ProviderName>kueno</ProviderName>
  <DefaultLocale>en-US</DefaultLocale>
  <DisplayName DefaultValue="OfficeAppWebService" />
  <Description DefaultValue="OfficeAppWebService Description"/>
  <Capabilities>
    <Capability Name="Workbook" />
  </Capabilities>
  <DefaultSettings>
    <!--<SourceLocation DefaultValue="~remoteAppUrl/Pages/OfficeAppWebService.html" />-->
    <SourceLocation DefaultValue="~remoteAppUrl/Test.aspx" />
    <RequestedWidth>400</RequestedWidth>
    <RequestedHeight>400</RequestedHeight>
  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
</OfficeApp>

※Pages にある html ファイルを呼ばずに、追加した Web フォームの aspx を呼びます。(コメントアウトの部分)

【Web サービス : WebService1.aspx.cs】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace OfficeAppWebServiceWeb
{
    /// <summary>
    /// WebService1 の概要の説明です
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]

    // この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。
    [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

※Defaultでは、[System.Web.Script.Services.ScriptService]はコメントアウトされているので、コメントを外します

【Web フォーム : Test.aspx】

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="OfficeAppWebServiceWeb.Call" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script type="text/javascript" language="javascript">
        function onButtonClick() {
            OfficeAppWebServiceWeb.WebService1.HelloWorld(AddSuccess, null, null);
        }

        function AddSuccess(result) {
            target = document.getElementById("output");
            target.innerHTML = result;
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <input type="button" value="Test" onclick="onButtonClick();" />
    </div>
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="WebService1.asmx" />
        </Services>
    </asp:ScriptManager>
    </form>
    <div id="output"></div>

</body>
</html>

組み込めたので、F5実行してみた。
Excel 上でコンテンツパーツとして配置、表示されました。
app_for_office_webservice_02

「Test」ボタンを押すと、テキスト「Hello World」が表示されます。
app_for_office_webservice_03

組み込んだ Web サービスも問題なく動作したので、
次回は、DB Server から実際にデータを取得して表示してみます。

Windows Sever のファイルログを取る方法 (WDK; Windows Driver Kit)

はじめに

Windows のファイルのアクセスログを取得する方法はいろいろあります。

大まかに考えると以下の方法が考えられます。

  1. Windows 標準のオブジェクト・アクセス監査
    (このデータを集計しているパッケージもいくつかあります。)
    http://itpro.nikkeibp.co.jp/article/COLUMN/20061127/254976/
  2. FileSystemWatcherクラスで取得する方法(詳細なログがとれなさそう)
    http://www.atmarkit.co.jp/fdotnet/dotnettips/281filewatch/filewatch.html
  3. API レベルでファイルI/Oをフックする方法
  4. File System Filter Driverでファイルログを取得する方法(推奨)

まずはAPIレベルでファイルI/Oをフックする方法を見てみます。

APIレベルのほとんどの方法はWidnows64bit OSの制限に引っかかるので、ファイルログをとるのには、後術する、 File System Filter Driver というのをおすすめします。

  1. グローバルフック (Global Hook)
    主な関数 SetWindowsHookEx()
    NtSetInfomaintFIleのフックには使えない
    MSのx64の制限事項になったと思われる。
    Message FIFOをフックしているだけなのでAPIフックには使用できない、
    キーボードや, マウスのフックは有効
    x86では問題なく、サンプルも豊富
  2. ラッパーDLL (Wrapper DLL)
    NTOSKERNL.exeをラッピングするのはやばそう。しないほうがよいかも
    通常はKernel32.dll 等のラッパーを作り、対象のexeファイルレベルでIATテーブルをファイルレベルで変更する。
    x86では問題なく、サンプルも豊富
  3. IATフック (ファイルベース)
    Srv.sys”(windows のファイルサービスのコアモジュール) のリバースエンジニアリング、不正改造にあたるかもしれない
    filelog0010
    ■手順
    ①「srv.sys」 をコピーして 「srvExone.Sys」を用意する。
    ②「srvExone.sys」 ファイルのIATテーブルを置き換え
    「NTOSKERNL.exe!NtSetInfomationFile」

    「FSM.sys!NtSetInfomationFile」
    ③registoryのservice の 「srv.sys」 から「srvExone.Sys」に変更する
    ■事前に以下を準備
    ①FMS.sys にexportとして「FSM.sys!NtSetInfomationFile」を準備する。
  4. IATフック (メモリベース)
    参考: http://keicode.com/windows/win09.php
    srv.sysはカーネルモードで動作するのでユーザモードからIAT書換不可
    IATは標準でメモリプロテクト状態(書換時メモリプロテクト例外でシステムダウン)
    ■検証方法
    ①fms.sysという自前デバイスドライバーを作って、カーネルモードで動作させる。
    ②fms.sysからIATテーブル書き換え
    x86-IAT書き換え成功
    方法->CPU CR0 Memory WriteProtect check bitを1にして
    メモリプロテクトチェック外し書き着替える。x64-IAT書き換えが不明
    方法1–>CPUのWriteProtectbitがどれか不明、–>調査必要
    ※また、x64コンパイラーから インラインアセンブラが使用付加となったため、
    MASMで書く必要がある。–>未調査方法2–>自作関数でメモリ自体のプロテクトを外す–>調査必要
    ユーザモード用意されている、メモリプロテクトを外す関数
    kernel32.dll!ProtectVirtualMemroy
    ntdll.dll!NtProtectVirtualMemroy
    ※カーネルモードでは ntoskernl.exeで作らないといけない③IATが実行する関数
    NtWriteProcessMemoryでsrv.sysに関数を追加するか必要があるが未検証
    おそらく NTOSKERNL.exe にNtWriteProcessMemoryないので、
    fms.sys をエクスポートして、それの関数名でIATをおきかえればよいと思う。
  5. SSDTフック
    参考:http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035
    MSのx64の制限事項になったと思われる。
    メモリレベルでSSDTテーブル書き換え
    (NTOSKERNL.exeのExportテーブル)
    x86では問題なく、サンプルも豊富
  6. 参考(IDT, SDT, SSDT, KiSystemService)
    http://itpro.nikkeibp.co.jp/article/COLUMN/20070928/283201/

Microsoft OS 64ビットでの規制

  • システム サービス テーブルの変更。(たぶんSSDTのこと)
    割り込みディスクリプタテーブル (IDT) の変更。
    グローバルディスクリプタテーブル (GDT) の変更。
    カーネルによって割り当てられないカーネル スタックの使用。
    (AMD64 システムでのみ検出される) カーネルの任意の部分へのパッチ当て。

File System Filter Driverのサンプルプログラム

参考: http://blogs.msdn.com/b/jpwdkblog/archive/2009/05/13/filesystem-filesystem-filter.aspx
昔はAPIレベルでフックしていたのですが、現在では 標準でファイルシステムへのリクエストをフィルタリングするモジュールを作成することが可能です。

WDK(windows driver kit) の中に MiniSpyというのがあるので、そのサンプルにつきまして解説したいと思います。

Windows Driver Kit 7の場合は以下に入っています。

WinDDK\7600.16385.1\src\filesys\miniFilter\minispy

私のPCはWindows XPなので、以下のメニューから コマンドプロンプトを立ち上げます。
\スタート メニュー\プログラム\Windows Driver Kits\WDK 7600.16385.1\Build Environments\Windows XP\x86 Checked Build Environment

filelog0020

ビルド方法

  1. まずはFile System Filter ドライバーのほうをコンパイルします。
    build “C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\filter\makefile” 
  2. File Filter をコントロールする法をコンパイルします。
    build  “C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\user\makefile”

インストール方法

  1. 以下のbuildで作成された、File System Filter ドライバーを右グリックしてインストールします。
    C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\filter\objchk_wxp_x86\i386\minispy.inf
  2. コマンドプロンプトからドライバーのサービスを起動します。
    net start minispy
    filelog0040

使用方法

  1. コマンドプロンプトから
    C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\user\objchk_wxp_x86\i386\minispy.exe
    filelog0030
  2. ?コマンドでコマンドがでてきます。
    filelog0050
  3. それでは、ファイルログを出力しましょう。Cドライブを監視するといっぱいでてきますので、USB(Fドライブ)をさしてそれを監視して、監視ログはCドライブに出力する設定をします。
    コマンドプロンプトから
    >/a F:  /f c:\log.txt
    filelog0060
  4. USB(Fドライブにファイルを作成してみます。
    そうすると以下のように”c:\log.txt” にログがでてきます。
    filelog0070
  5. 最後にログ取得を切り離して、サービスを終了させておきます。
    コマンドプロンプトから
    >/d F:
    >exit
    c:\>net stop minispy
  6. Excelで簡単なminispyの構造を書きました。
    minispystruct

その他

  1. もちろん以下のようにWinDBGでデバックできます。
    Windowsカーネルデバックの準備(Virtual PC)

参考URL

HOOK

  1. インサイドMicrosoft Windows 第4版 上
    http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_01.html
  2. Windowsのプロセスツリー
    http://ittechinf.wiki.zoho.com/Windows%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%84%E3%83%AA%E3%83%BC.html#Windows%20NT%20Logon%20Application
  3. デバイスドライバー
    http://ruffnex.oc.to/kenji/windriver/
  4. Windows API
    http://msdn.microsoft.com/ja-jp/library/cc429126.aspx
  5. DLLの遅延読み込みをフックする
    http://hikarukaru.jugem.cc/?eid=83
  6. ファイル共有プロトコルSMB/CIFS(その1)
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan020/baswinlan020_01.html
  7. 2.共有ファイルのアクセスを追跡してみる
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan002/baswinlan002_03.html

    1. http://d.hatena.ne.jp/kenjiaiko/20080727/1217108068
    2. http://www.openrce.org/reference_library/win32_call_chains
    3. http://www.openrce.org/reference_library/win32_call_chains/XPSP1/KERNEL32/DeleteFileW
  8. どのシステムコールがどの関数から呼ばれているの?
    1. NtSetInformationFile hook
    2. http://www.rohitab.com/discuss/topic/36500-deletefile-hook/page__st__20
  9. Hook基礎
    http://japan.internet.com/developer/20050830/26.html#section_2
  10. 64bit32bitインジェクション
    http://nazochu.blogspot.com/2011/09/64bit32bitdll-injection.html
  11. trying to hook ntSetInfomationFile, but explorer is crashing
    http://forum.madshi.net/viewtopic.php?t=4992
  12. blocking file execution and movement with NtCreate/Openfile
    http://forum.madshi.net/viewtopic.php?t=4282
  13. http://d.hatena.ne.jp/kenjiaiko/20080728/1217198987
  14.  _FILE_INFORMATION_CLASS
    http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/FILE_INFORMATION_CLASS.html
  15. http://hex.pp.ua/nt/NtSetInformationFile.php
  16. http://msdn.microsoft.com/en-us/library/windows/desktop/aa365539(v=vs.85).aspx
  17. http://www.koders.com/c/fid821E16CA3AE274D8F627BCB75E95297371556012.aspx
  18. http://source.winehq.org/source/dlls/ntdll/file.c
  19. http://blog.airesoft.co.uk/code/fileid.cpp
  20. NTSTATUSエラーコード一覧
    http://accelart.jp/blog/NTSTATUSErrMsgJa.html
  21. NT DLL.h
    http://www.koders.com/c/fidD9B5EEE83DE76C7F43FCF6375ED2738BD2695194.aspx
  22. NT DLL.h
    http://webcache.googleusercontent.com/search?q=cache:XTpVoggQSDwJ:www.hackchina.com/en/r/185563/NTDLL.H__html+NtSetInformationFile+ntdll.h&cd=20&hl=ja&ct=clnk&gl=jp
  23. Hook NtSetInfomationFile
    http://read.pudn.com/downloads/2420/HookAPI1.62/DLL/HookAPI.cpp__.htm
  24. madCodeHook
    http://forum.madshi.net/viewtopic.php?f=7&t=26492
  25. 別のプロセスにコードを割り込ませる3つの方法
    http://japan.internet.com/developer/20050830/26.html#section_3
  26. http://www.codeguru.com/cpp/
  27. DLL入門
    http://web.kyoto-inet.or.jp/people/ysskondo/chap11.html
  28. messagebox hook
    http://jackseven.s22.xrea.com/programming/apihook.html
  29. http://ruffnex.oc.to/kenji/text/api_hook/
  30. 別のプロセスへのDLLマッピング
    http://ruffnex.oc.to/kenji/text/dll_inj/
  31. ImageDirectoryEntryToData
    http://dsas.blog.klab.org/archives/50908743.html
  32. http://jackseven.s22.xrea.com/programming/apihook.html
  33. http://keicode.com/windows/win09.php
  34. Kernel64
    http://sgry.jp/pgarticles/64.html
  35. windows cifs 認証 SMBパケット構造がある、ここにユーザID
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan022/baswinlan022_01.html
  36. windows cifs 認証 パケット構造とか全部ある
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan021/baswinlan021_01.html
  37. 開いているファイルの調査
    http://www.atmarkit.co.jp/fwin2k/win2ktips/306openfiles/openfiles.html
  38. ファイルやレジストリにアクセスしているプロセスを調べる@Process Monitor
    http://pnpk.net/cms/archives/298
  39. OpenedFilesView v1.52
    http://www.nirsoft.net/utils/opened_files_view.html
  40. NTWritefile  システムアーキテクチャ
    http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_04.html
  41. srv.sys
    1. http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_07.html
    2. http://ittechinf.wiki.zoho.com/Windows-%E3%82%B5%E3%83%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html
    3. http://ittechinf.wiki.zoho.com/Windows%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%84%E3%83%AA%E3%83%BC.html#Windows%20NT%20Logon%20Application
    4. http://forum.madshi.net/viewtopic.php?t=5292
  42. Filemon ソース
    1. http://forum.madshi.net/viewtopic.php?t=5292
    2. http://www.wasm.ru/baixado.php?mode=tool&id=283
  43. IFSMgr_InstallFileSystemApiHook
    Examining the Windows NTFilesystem
    http://drdobbs.com/windows/184410131
  44. File System Filter Drivers
    http://msdn.microsoft.com/en-us/windows/hardware/gg462968.aspx
  45. srv.sys srvsvc.dll
    1. http://support.microsoft.com/kb/830901/ja
    2. http://srv-sys.file.file-is.com/
  46. ファイルシステムフィルタドライバ ―
    http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_06.html
  47. srv.sys smb
    http://forum.sysinternals.com/virtual-backup-to-cifs-share_topic19797.html
  48. windows driver 開発
    http://www.microsoft.com/japan/powerpro/TF/column/ah_01_1.mspx
  49. Windows Device Driver Programming Part 1
    http://ruffnex.oc.to/kenji/windriver/
  50. DriverObject と DriverEntry
    1. http://blogs.msdn.com/b/jpwdkblog/archive/2009/05/22/driverobject-driverentry.aspx
    2. http://www.devdrv.co.jp/seminar/31-2005.pdf
  51. DDK Download
    http://msdn.microsoft.com/en-us/windows/hardware/gg454513.aspx
  52. WinObj
    http://technet.microsoft.com/ja-jp/sysinternals/bb896657(en-us).aspx
  53. ntoskrnl 4
    http://www.atmarkit.co.jp/fwin2k/win2ktips/236portcheck/portcheck.html
  54. svchost.exe プロセスとは
    http://www.atmarkit.co.jp/fwin2k/win2ktips/400svchost/svchost.html
  55. System Service Dispatch Table (SSDT)
    http://dl.packetstormsecurity.net/hitb04/hitb04-chew-keong-tan.pdf
  56. hook KiServiceTable
    1. http://d.hatena.ne.jp/mayahu32/20111023/1319381614
    2. http://www.codeproject.com/KB/system/lookup.aspx
  57. ZwTerminateProcess()のフック
    http://d.hatena.ne.jp/mayahu32/?of=5
  58. ZwCreateFile()をフックしてファイルの作成とオープンを禁止する
    1. http://d.hatena.ne.jp/mayahu32/
    2. http://d.hatena.ne.jp/mayahu32/20111104/1320391133
  59. ドライバー開発
  60. http://ruffnex.oc.to/kenji/windriver/
  61. http://ruffnex.oc.to/kenji/windriver/driver2.html
  62. http://ameblo.jp/tamanotsuribori/entry-10087249604.html
  63. KeInitializeSpinLock
    1. http://blog.livedoor.jp/blackcat_1973/archives/2005-05.html?p=2
    2. http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%83%B3%E3%83%AD%E3%83%83%E3%82%AF

DDK

  1. KeAcquireSpinLock
    処理が終わるまでほかのCPUが変数にアクセスできなくすることができる
    http://blog.livedoor.jp/blackcat_1973/archives/2005-05.html?p=2
  2. KeReleaseSpinLock
    ビジーウェイト状態を発生させる
    http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%83%B3%E3%83%AD%E3%83%83%E3%82%AF
  3. InterlockedIncrement
    指定された変数の値をインクリメント
  4. InterlockedDecrement
    指定された変数の値をデクリメント
  5. InterlockedOr
  6. ExAllocateFromNPagedLookasideList
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff544601(v=vs.85).aspx
  7. InterlockedExchange
    http://msdn.microsoft.com/ja-jp/library/cc429230.aspx
  8. ROUND_TO_SIZE
  9. RtlCopyMemory
    http://nadia.kabe.to/bluewater/techniq/
  10. KeQuerySystemTime
    http://support.microsoft.com/kb/239818/ja
  11. InsertTailList
    http://keicode.com/windows/list-entry.php
  12. RemoveHeadList
  13. InitializeListHead
  14. InsertHeadList
  15. InsertTailList
  16. IsListEmpty
  17. RemoveTailList
  18. InitializeObjectAttributes
    http://support.microsoft.com/kb/891805/ja
  19. ZwOpenKey
    http://blog.livedoor.jp/blackcat_1973/archives/20918953.html
  20. ZwQueryValueKey
  21. ZwClose
  22. FltGetFileNameInformation
  23. FilterConnectCommunicationPort
  24. CreateSemaphore
    http://msdn.microsoft.com/ja-jp/library/cc429076.aspx
  25. WaitForSingleObject
  26. IoIs32bitProcess
    http://blogs.msdn.com/b/jpwdkblog/archive/2009/06/24/9801511.aspx
  27. FltCreateCommunicationPort
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff541931(v=vs.85).aspx
  28. http://support.microsoft.com/kb/262305/ja
  29. 未使用引数の注意文出力を回避するには
    UNREFERENCED_PARAMETER
  30. メモリを節約  #pragma alloc_text INIT
    http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/kernel.html
  31. メモリ領域を節約 #pragma alloc_text PAGE
  32. 勉強 基礎サイト
    http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/kernel.html
  33. DriverEntry(
    DriverObject ドライバオブジェクトへのポインタ.
    RegistryPath ドライバのレジストリキーを示すユニコード文字列
  34. ミューテックス
    相互排他制御に用いる
  35. NtCancelIoFile
    http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/data/02-WindowsDriverModel.pdf
  36. FltGetRoutineAddress
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff543140(v=vs.85).aspx
  37. MmGetSystemRoutineAddress
    http://msdn.microsoft.com/ja-jp/windows/hardware/gg463187
  38. カーネル モード ドライバーで DLL を呼び出す
    http://msdn.microsoft.com/ja-jp/windows/hardware/gg463187
  39. FltRegisterFilter
  40. FltBuildDefaultSecurityDescriptor
  41. FltCreateCommunicationPort
  42. FltFreeSecurityDescriptor
  43. RtlInitUnicodeString
  44. ExInitializeNPagedLookasideList
    http://blog.livedoor.jp/blackcat_1973/archives/20897723.html
  45. ドライバロード設定と動作手順
    http://d241445.hosting-sv.jp/community/report/report19.html
  46. 64ビット版ドライバのデジタル署名について
    http://www.wdddc.net/node/117
  47. Winqual と LogoPoint
    http://www.wdddc.net/node/107
  48. ユーザー モード ドライバー フレームワーク (UMDF
    http://msdn.microsoft.com/ja-jp/windows/hardware/gg463294
  49. ファイルシステムフィルタードライバー
    http://www.wdddc.net/node/43
  50. 64bit版ドライバのインストールとテスト
    http://www.devdrv.co.jp/windows/#64bihttp://www.devdrv.co.jp/windows/#64bi
  51. イベントログ出力
    http://blogs.msdn.com/b/jpwdkblog/archive/2011/05/31/10169819.aspx
  52. Windows Device Driver Programming Part 2
    http://ruffnex.oc.to/kenji/windriver/driver2.html
  53. 新しいファイル I/O キャンセル API
    http://msdn.microsoft.com/ja-jp/library/aa480216.aspx
  54. DDK:ドライバからの非同期イベントの通知
    http://support.microsoft.com/kb/117308/ja
  55. 64ビットデバイスドライバーのデジタル署名
    http://social.technet.microsoft.com/Forums/ja/w7itprohardwareja/thread/14bbc011-2402-48d8-a796-f9c5c7e7579e
  56. [NT DDK] ZwCreateFile()によるファイルのオープン方法
    http://support.microsoft.com/kb/891805/ja
  57. サンプル
    C:\WinDDK\7600.16385.1\src\general\ioctl\kmdf\sys\nonpnp.c
  58. ドライバからのファイルアクセス
    http://blog.livedoor.jp/blackcat_1973/archives/20955624.html
  59. PsCreateThread svn/ trunk/ kernel/ inc/ ddk/ ps.h
    http://code.google.com/p/gr8os/source/browse/trunk/kernel/inc/ddk/ps.h?spec=svn49&r=49
  60. http://blog.livedoor.jp/blackcat_1973/archives/2005-05.html?p=2
  61. ファイル ハンドルの取得
    1. http://support.microsoft.com/kb/891805/ja
    2. http://d.hatena.ne.jp/i53/20101202/1291284611
  62. Nt vs. Zw
  63. zwcreatefile asynchronous
    http://social.msdn.microsoft.com/Forums/en-US/wdk/thread/26b7e937-fcbc-4fb5-b473-ce4d815c7025/
  64. ZwCreateFile for Asynchronous handle
    1. http://www.mofeel.net/31-microsoft-public-development-device-drivers/22331.aspx
    2. http://www.techtalkz.com/microsoft-device-drivers/262761-zwwritefile-buffer-reuse.html
    3. http://social.msdn.microsoft.com/Forums/en-US/wdk/thread/0b5cd10a-5011-4bc4-acea-5bc0ed3b9a3d
  65. PsCreateSystemThread
    http://www.hackchina.com/en/r/149028/log.c__html
  66. カーネルスレッド
    http://blog.livedoor.jp/blackcat_1973/archives/22269616.html
  67. FltCreateFile
    http://www.osronline.com/showThread.CFM?link=214635
  68. ZwCreateFile
    http://support.microsoft.com/kb/891805
  69. ZwCreateFile
    http://www.codeguru.com/forum/showthread.php?t=512314
  70. RtlStringCbPrintfA
    http://www.osronline.com/DDKx/kmarch/safestrings_7zua.htm
  71. FltRegisterFilter
  72. FltBuildDefaultSecurityDescriptor
  73. FltCreateCommunicationPort
  74. FltFreeSecurityDescriptor
  75. FltStartFiltering
  76. “FltRegisterFilter Teardown FilterDetach”
    http://win32.blog80.fc2.com/blog-category-1.html
     

Officeアプリ(App for Office, Microsoft, Office365) にJQuery のUIのサンプルプログラム追加の方法

はじめに

前回の クラウド/Office365でOffice アプリ(App for Office)を SharePoint アプリカタログ(App Catalog)に登録してサンプルを動かしてみよう。 に引き続き

今回は、Officeアプリでは標準のHTMLとJavaScriptでプログラムを作ります。

JQueryも使えると便利です。以下のように JQuery UIのサンプルを組み込んでみましょう。

JQuery User Interface サンプルプログラム

  1. accordion (アコーディオン)
  2. autocomplete (オートコンプリート)
  3. button (ボタン)
  4. radioset (ラジオボタン)
  5. tabs (タブ)
  6. dialog (ダイアログ)
  7. datepicker (日付選択)
  8. slider (スライダー)
  9. progressbar (プログレスバー)

officeapp_jsquery010

手順

最初にJQuery User Interface をダウンロードします。

http://jqueryui.com/download/

officeapp_jsquery020

ダウンロードしたファイルをどこでもいいのですが、以下のように配置します。

officeapp_jsquery030

  1. Scripts/jquery-ui-custom/css/ui-lightness/jquery-ui-1.10.1.custom.css
  2. Scripts/jquery-ui-custom/js/jquery-1.9.1.js
  3. Scripts/jquery-ui-custom/js/jquery-ui-1.10.1.custom.js

※圧縮された min.css , min.js を使ってもよいですが、今回はdebugもしたいので、 minは使いません。

Visual Studio から自動生成された OfficeアプリのHTMLに以下のように追加します。

Pages/Test_OfficeApp_001.html

officeapp_jsquery040

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <title>Test_OfficeApp_001</title>

    <link rel="stylesheet" type="text/css" href="../Content/Office.css" />

    <!-- 次のファイルに CSS スタイルを追加します -->
    <link rel="stylesheet" type="text/css" href="../Content/App.css" />

<!--元のJQueryはふるいのでコメントアウト-->
    <!--<script src="../Scripts/jquery-1.7.1.js"></script>-->

<!--Start: JQuery, JQuery UIをインポートする。-->
    <link href="../Scripts/jquery-ui-custom/css/ui-lightness/jquery-ui-1.10.1.custom.css" rel="stylesheet" />
    <script src="../Scripts/jquery-ui-custom/js/jquery-1.9.1.js"></script>
    <script src="../Scripts/jquery-ui-custom/js/jquery-ui-1.10.1.custom.js"></script>
<!--End: JQuery, JQuery UIをインポートする。-->

    <!-- アプリを配置する際に Office.js への CDN 参照を使用します -->
    <!--<script src="https://appsforoffice.microsoft.com/lib/1.0/hosted/office.js"></script>-->

    <!-- Office.js のローカル スクリプト参照を使用してオフラインのデバッグを有効にします -->
    <script src="../Scripts/Office/1.0/MicrosoftAjax.js"></script>
    <script src="../Scripts/Office/1.0/office.js"></script>

    <!-- 次のファイルに JavaScript を追加します -->
    <script src="../Scripts/Test_OfficeApp_001.js"></script>

<!--Start: JQuery UI Sample program を追加する。-->

    	<script>
    	    $(function () {
    	        $("#accordion").accordion();

    	        var availableTags = [
                    "ActionScript",
                    "AppleScript",
                    "Asp",
                    "BASIC",
                    "C",
                    "C++",
                    "Clojure",
                    "COBOL",
                    "ColdFusion",
                    "Erlang",
                    "Fortran",
                    "Groovy",
                    "Haskell",
                    "Java",
                    "JavaScript",
                    "Lisp",
                    "Perl",
                    "PHP",
                    "Python",
                    "Ruby",
                    "Scala",
                    "Scheme"
    	        ];
    	        $("#autocomplete").autocomplete({
    	            source: availableTags
    	        });

    	        $("#button").button();
    	        $("#radioset").buttonset();

    	        $("#tabs").tabs();

    	        $("#dialog").dialog({
    	            autoOpen: false,
    	            width: 400,
    	            buttons: [
                        {
                            text: "Ok",
                            click: function () {
                                $(this).dialog("close");
                            }
                        },
                        {
                            text: "Cancel",
                            click: function () {
                                $(this).dialog("close");
                            }
                        }
    	            ]
    	        });

    	        // Link to open the dialog
    	        $("#dialog-link").click(function (event) {
    	            $("#dialog").dialog("open");
    	            event.preventDefault();
    	        });

    	        $("#datepicker").datepicker({
    	            inline: true
    	        });

    	        $("#slider").slider({
    	            range: true,
    	            values: [17, 67]
    	        });

    	        $("#progressbar").progressbar({
    	            value: 20
    	        });

    	        // Hover states on the static widgets
    	        $("#dialog-link, #icons li").hover(
                    function () {
                        $(this).addClass("ui-state-hover");
                    },
                    function () {
                        $(this).removeClass("ui-state-hover");
                    }
                );
    	    });
	</script>
	<style>
	body{
		font: 62.5% "Trebuchet MS", sans-serif;
		margin: 50px;
	}
	.demoHeaders {
		margin-top: 2em;
	}
	#dialog-link {
		padding: .4em 1em .4em 20px;
		text-decoration: none;
		position: relative;
	}
	#dialog-link span.ui-icon {
		margin: 0 5px 0 0;
		position: absolute;
		left: .2em;
		top: 50%;
		margin-top: -8px;
	}
	#icons {
		margin: 0;
		padding: 0;
	}
	#icons li {
		margin: 2px;
		position: relative;
		padding: 4px 0;
		cursor: pointer;
		float: left;
		list-style: none;
	}
	#icons span.ui-icon {
		float: left;
		margin: 0 4px;
	}
	.fakewindowcontain .ui-widget-overlay {
		position: absolute;
	}
	</style>
<!--End: JQuery UI Sample program を追加する。-->

</head>
<body>
    <!-- 以下をコンテンツに置き換えてください -->
    <div id="Content">
        <input type="button" value="Set data" id="setDataBtn" style="margin-right: 10px; padding: 0px; width: 100px;" />
        <input type="button" value="Get data" id="getDataBtn" style="padding: 0px; width: 100px;" />
        <input type="text" value="Sample Data" id="selectedDataTxt" style="margin-top: 10px; width: 210px" />
    </div>

<!--Start: JQuery UI Sample program を追加する。-->

    <h1>Welcome to jQuery UI!</h1>

<div class="ui-widget">
	<p>This page demonstrates the widgets you downloaded using the theme you selected in the download builder. We've included and linked to minified versions of <a href="js/jquery-1.9.1.js">jQuery</a>, your personalized copy of <a href="js/jquery-ui-1.10.1.custom.min.js">jQuery UI (js/jquery-ui-1.10.1.custom.min.js)</a>, and <a href="css/ui-lightness/jquery-ui-1.10.1.custom.min.css">css/ui-lightness/jquery-ui-1.10.1.custom.min.css</a> which imports the entire jQuery UI CSS Framework. You can choose to link a subset of the CSS Framework depending on your needs. </p>
	<p>You've downloaded components and a theme that are compatible with jQuery 1.6+. Please make sure you are using jQuery 1.6+ in your production environment.</p>
</div>

<h1>YOUR COMPONENTS:</h1>

<!-- Accordion -->
<h2 class="demoHeaders">Accordion</h2>
<div id="accordion">
	<h3>First</h3>
	<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
	<h3>Second</h3>
	<div>Phasellus mattis tincidunt nibh.</div>
	<h3>Third</h3>
	<div>Nam dui erat, auctor a, dignissim quis.</div>
</div>

<!-- Autocomplete -->
<h2 class="demoHeaders">Autocomplete</h2>
<div>
	<input id="autocomplete" title="type &quot;a&quot;">
</div>

<!-- Button -->
<h2 class="demoHeaders">Button</h2>
<button id="button">A button element</button>
<form style="margin-top: 1em;">
	<div id="radioset">
		<input type="radio" id="radio1" name="radio"><label for="radio1">Choice 1</label>
		<input type="radio" id="radio2" name="radio" checked="checked"><label for="radio2">Choice 2</label>
		<input type="radio" id="radio3" name="radio"><label for="radio3">Choice 3</label>
	</div>
</form>

<!-- Tabs -->
<h2 class="demoHeaders">Tabs</h2>
<div id="tabs">
	<ul>
		<li><a href="#tabs-1">First</a></li>
		<li><a href="#tabs-2">Second</a></li>
		<li><a href="#tabs-3">Third</a></li>
	</ul>
	<div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
	<div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
	<div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
</div>

<!-- Dialog NOTE: Dialog is not generated by UI in this demo so it can be visually styled in themeroller-->
<h2 class="demoHeaders">Dialog</h2>
<p><a href="#" id="dialog-link" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-newwin"></span>Open Dialog</a></p>

<h2 class="demoHeaders">Overlay and Shadow Classes <em>(not currently used in UI widgets)</em></h2>
<div style="position: relative; width: 96%; height: 200px; padding:1% 2%; overflow:hidden;" class="fakewindowcontain">
	<p>Lorem ipsum dolor sit amet,  Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. </p><p>Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. </p><p>Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. </p>

	<!-- ui-dialog -->
	<div class="ui-overlay"><div class="ui-widget-overlay"></div><div class="ui-widget-shadow ui-corner-all" style="width: 302px; height: 152px; position: absolute; left: 50px; top: 30px;"></div></div>
	<div style="position: absolute; width: 280px; height: 130px;left: 50px; top: 30px; padding: 10px;" class="ui-widget ui-widget-content ui-corner-all">
		<div class="ui-dialog-content ui-widget-content" style="background: none; border: 0;">
			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
		</div>
	</div>

</div>

<!-- ui-dialog -->
<div id="dialog" title="Dialog Title">
	<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>

<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
<ul id="icons" class="ui-widget ui-helper-clearfix">
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-n"><span class="ui-icon ui-icon-carat-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-ne"><span class="ui-icon ui-icon-carat-1-ne"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-e"><span class="ui-icon ui-icon-carat-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-se"><span class="ui-icon ui-icon-carat-1-se"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-s"><span class="ui-icon ui-icon-carat-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-sw"><span class="ui-icon ui-icon-carat-1-sw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-w"><span class="ui-icon ui-icon-carat-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-1-nw"><span class="ui-icon ui-icon-carat-1-nw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-n-s"><span class="ui-icon ui-icon-carat-2-n-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-carat-2-e-w"><span class="ui-icon ui-icon-carat-2-e-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li>
	<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
</ul>

<!-- Slider -->
<h2 class="demoHeaders">Slider</h2>
<div id="slider"></div>

<!-- Datepicker -->
<h2 class="demoHeaders">Datepicker</h2>
<div id="datepicker"></div>

<!-- Progressbar -->
<h2 class="demoHeaders">Progressbar</h2>
<div id="progressbar"></div>

<!-- Highlight / Error -->
<h2 class="demoHeaders">Highlight / Error</h2>
<div class="ui-widget">
	<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;">
		<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
		<strong>Hey!</strong> Sample ui-state-highlight style.</p>
	</div>
</div>
<br>
<div class="ui-widget">
	<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;">
		<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>
		<strong>Alert:</strong> Sample ui-state-error style.</p>
	</div>
</div>

<!--End: JQuery UI Sample program を追加する。-->

</body>
</html>

実行すると以下のように JQuery User Interface のサンプルが表示されます。

officeapp_jsquery010

クラウド/Office365でOffice アプリ(App for Office)を SharePoint アプリカタログ(App Catalog)に登録してサンプルを動かしてみよう。

前回は、Office アプリ(App for Office)を Windows Azure へ発行できたので、

今度は SharePoint のアプリ カタログ(App Catalog)に登録してみよう。

前回の記事 Office アプリ(App for Office)を、Windows Azure Web サイトに発行する

はじめに 以下の図のようにOfficeアプリを動作させてみました。

今回は、WebサイトにOfficeアプリ(App for Office) を配置して、Officeアプリの定義ファイルはShaerPoint2013に配置しました。 また、Webサイトに「Windows Azure」を使用し、OfficeアプリカタログにSharePoint2013(Office365/on-premise)を使用しました。 ※Webサイトはhttp通信ができれば、何でもOKです。また、アプリカタログは定義ファイル(xml)を配置するだけなので、ファイルサーバにも配置可能です

appforoffice0060

アプリ登録手順

SharePoint にカタログ(App Catalog)を作成して、アプリを登録しましょう。 Share Point にカタログを作成する

1. SharePoint 上で、カタログサイトを作成します。

app_for_office_vs2012_002

作成した URL は、Office 側で信頼させる必要がありますので、メモっておきましょう。 2. 今回配布したいのは、Office 用アプリなので「Office 用アプリの配布」を選択します。

app_for_office_catalog2

3. アプリを追加するので、「新しいアプリ」を選択します。

 

app_for_office_catalog3

4. カタログに配布する際、SharePoint は “アプリ「app」” だが、Office は “定義ファイル「xml」” になる。 定義ファイルは「DocTest1\DocTest1\DocTest1」にあります。 また、定義ファイル(xml)内にある、アプリのURLを修正

<?xml version="1.0" encoding="UTF-8"?>
<!--Created:cb85b80c-f585-40ff-8bfc-12ff4d0e34a9-->
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="TaskPaneApp">
  <Id>e554769a-d335-4ee0-8e99-1b266b5723ba</Id>
  <Version>1.0</Version>
  <ProviderName>snoro</ProviderName>
  <DefaultLocale>en-US</DefaultLocale>
  <DisplayName DefaultValue="Test_OfficeApp_001" />
  <Description DefaultValue="Test_OfficeApp_001 Description"/>
  <Capabilities>
    <Capability Name="Workbook" />
    <Capability Name="Presentation" />
    <Capability Name="Project" />
    <Capability Name="Document" />
  </Capabilities>
  <DefaultSettings>
    <!--<SourceLocation DefaultValue="~remoteAppUrl/Pages/Test_OfficeApp_001.html" />-->
    <SourceLocation DefaultValue="http://exceedone-test.azurewebsites.net/Pages/DocTest1.html" />
  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
</OfficeApp>
app_for_office_catalog4

5. 登録されると以下のように表示されます。

app_for_office_catalog5

これでカタログ(Catalog)に登録できたので、Office で登録したアプリが表示されるか確認してみます。

Office でアプリをインストールする

0. Office で登録したカタログを表示させるには、「オプション」 → 「セキュリティセンター」 → 「セキュリティセンターの設定」 → 「信頼できるアプリカタログ」 で、カタログサイトURL を信頼させる必要があります。 appforoffice0010

Office365(SharePoint2013 アプリカタログ)だと以下のようにアクセスが拒否されましたたので、あとで調査します。

appforoffice0020

Excelのセキュリティ設定でオンプレミス(on-premise)のSharePoint2013 アプリカタログで、試してみます。

appforoffice0030

Excel/挿入/Office のリボンから「Office 用アプリ」を選択します。 アプリが表示されるので、アプリを選んで挿入します。

appforoffice0040

以下のようにアプリが動作しました。

appforoffice0050

クラウド見積・請求アプリの企画(Microsoft Officeアプリ)

企画書は以下のSlideShareに置きました。

http://www.slideshare.net/seijinoro/officever1

 

一部抜粋

はじめに

›Microsoft のOfficeアプリという開発手法がリリースされた!
この技術を使用すれば、いつでも、どこでも、どんな環境でも、サービス提供できるアプリを作成できる、さらに、クラウドのOffice365と連携してソーシャル機能と連携すれば、いままでと違った情報共有ができ、お客様に素晴らしい提案が可能となる。
›
›この技術は素晴らしいので、アプリを作成してみたいと思い、この企画を行った。
›
›この企画書 Ver1は1時間で作成し、アジャイル的な方法で随時更新を行い、よりよいものにしていこうと思います。もしかアドバイス等ありましたら、以下までお気軽にメールをいただけたら幸いです。
›
›作成者:野呂清二

Facebook
http://www.facebook.com/seiji.noro

オフィスアプリ(App for Office 2013) を Windows Azure Web サイトに発行する

前回は、App for Office 2013 のサンプルを作成してみましたが、Microsoft の App for Office / App for SharePoint セミナーにて実践したみたので、記事にしてみます。

前回の記事
はじめての App for Office 2013(Officeアプリ)で開発してみる

Server は、Windows Azure を使いました。
Windows Azure は、3か月無償で試せるので是非使ってみよう!

オフィスアプリ(App for Office)を作成して Windows Azure の Webサイトに発行するため、Azure の「発行プロファイル」を発行しておきましょう。
アプリの発行時、各種設定情報を保持しているので、無いと設定が面倒?というか出来ないと思います。

Windows Azure でテスト用のWebサイトを作成する

Windows Azure については、ここで詳細な手順を紹介しています。
超簡単、はじめての Windows Azure with Visual Studio 2012 and SharePoint2013(Office365, on-premise)

Windows Azure で発行プロファイルを作成する

1. テスト用 Webサイトをクリックする。
app_for_office_azure_setting

2. 「発行プロファイルの保存」をクリックします。
app_for_office_azure_setting2

保存先は、開発環境下ならとりあえず何処でもいいです。

Window Azure 側の設定(Setting)はここまで。
次は、Visual Studio 2012 側の設定(Setting)を行います。

Visual Studio 2012 で、Azure から発行した「発行プロファイル」を読み込む

1. DocTest1 という名前で、プロジェクトを作成して、発行処理を行います。
app_for_office_vs2012_001

2. 「発行プロファイル」を選択するため、「インポート」をクリックします。
app_for_office_vs2012_001b

3. 「発行プロファイル」が表示されるので、選択します。
app_for_office_vs2012_001c

4. 【接続】情報が自動で設定されるので、「次へ」をクリック。
app_for_office_vs2012_001d

5. 【設定】も自動で設定されるので、「次へ」をクリック。
app_for_office_vs2012_001e

6. 【プレビュー】は、何も表示されていない状態なので、「プレビューの開始」をクリック。
app_for_office_vs2012_001f

7. 一覧が表示されました。「発行(P)」をクリックしたら、Windows Azure 画面が開くはずです。
app_for_office_vs2012_001g

Windows Azure でオフィスアプリ(App for Office)を確認してみる

1. アプリが正常に発行できると、Windows Azure 画面が開きます。
app_for_office_azure3

2. URL の最後に、アプリ URL 「/Pages/DocTest1.html」を追加して、Enterキーを押す。
app_for_office_azure4

アプリが表示されました。
問題ないようですね。

次回は、クラウド/Office365でOffice アプリ(App for Office)を SharePoint アプリカタログ(App Catalog)に登録してサンプルを動かしてみよう。