1. 程式人生 > >C# winform 編譯成功後為程式新增清單檔案,新增Icon以及強簽名

C# winform 編譯成功後為程式新增清單檔案,新增Icon以及強簽名

為了使程式不出警告,強簽名這裡是在最後完成的。

簡單說一下過程:

1.新建一個文字檔案,輸入以下程式碼:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
  version="1.0.0.0"
  processorArchitecture="X86"
  name="AppName"
  type="win32"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
    </requestedPrivileges>
  </security>
</trustInfo>
</assembly>

上面的資原始檔裡有一個配置選項叫requestedExecutionLevel,  這個項用於配置當前應用請求的執行許可權級別。這個項有3個值可供選擇,如下所示:

asInvoker : 如果選這個,應用程式就是以當前的許可權執行。

highestAvailable: 這個是以當前使用者可以獲得的最高許可權執行。

requireAdministrator: 這個是僅以系統管理員許可權執行。

儲存後改名為AppName.exe.manifest

利用mt.exe來注入該清單檔案。

命令列:mt -mainfest AppName.exe.manifest -outputresource:AppName.exe ;#1

2.新增Icon

命令列:ReplaceVistaIcon.exe AppName.exe Icon.ico

ReplaceVistaIcon.exe是一個小工具。

3.強簽名

命令列:sn -R AppName.exe Private.snk

將以上三段命令列寫入編譯後事件中,即可。

C# <wbr>winform <wbr>編譯成功後為程式新增清單檔案,新增Icon以及強簽名

另:

要注意,程式強簽名要設定為延遲簽名。

即:程式簽名處的AssemblyDelaySign屬性設定為true([assembly:AssemblyDelaySign(true)])

以上命令列都是VS自帶的command所執行的所以使用時,App可執行檔案(exe),SN.EXE,MT.EXE,清單檔案,ico圖示等的目錄需要根據實際情況設定。

判斷程式是否以管理員身份執行

 需要新增名稱空間:

using System.Security.Principal;

複製程式碼
    /// <summary>
    /// 確定當前主體是否屬於具有指定 Administrator 的 Windows 使用者組
    /// </summary>
    /// <returns>如果當前主體是指定的 Administrator 使用者組的成員,則為 true;否則為 false。</returns>
    public static bool IsAdministrator()
    {
        bool result;
        try
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            result = principal.IsInRole(WindowsBuiltInRole.Administrator);

            //http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
            //AppDomain domain = Thread.GetDomain();
            //domain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
            //WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
            //result = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
        }
        catch
        {
            result = false;
        }
        return result;
    }
複製程式碼