Windows7軟件開發(fā)示例:UAC、系統(tǒng)版本、權(quán)限

2009/11/14 12:55:31    編輯:軟媒 - 笨笨     字體:【

Win7之家afsion.com.cn):Windows7軟件開發(fā)示例:UAC、系統(tǒng)版本、權(quán)限

  本文作者:魏偉,微軟MVP(微軟最有價值專家),產(chǎn)品設(shè)計&系統(tǒng)架構(gòu)師,研發(fā)的產(chǎn)品主要有電話會議服務(wù)、移動代理服務(wù)器、無線開發(fā)中間件等。

  看到Win7的酷炫功能流口水,已經(jīng)忍不住想擁抱呢?別急,Win7的脾氣可不好,要想擁抱它的新功能,我們的軟件必須嫁給它——在Win7下能正常運行。,個人開發(fā)者開發(fā)的中小軟件,功能相對簡單,與系統(tǒng)的緊密程度普遍較低,添加一些Win7必要的正常運行的元素就OK啦!

嫁給Win7的必要條件

  我們必須要給軟件添加的是系統(tǒng)版本檢測和安裝路徑選擇元素,為什么要考慮它們呢?

必要條件1:檢測系統(tǒng)版本

  軟件在運行初期需要判斷操作系統(tǒng)的類型及版本號,并根據(jù)操作系統(tǒng)類型執(zhí)行特定的代碼,相同的功能在不同操作系統(tǒng)上可能會執(zhí)行不同的代碼。大多數(shù)軟件的在Win7下無法正常運行都是因為判斷操作系統(tǒng)版本失敗造成的。

  當(dāng)版本檢測出錯時,很多軟件也會跟著出錯,用戶可能會發(fā)現(xiàn)雙擊軟件圖片后,什么反映都沒有,或者可能會看到一個對話框“你必須運行在Microsoft Windows XP或更新版本”,但實際上計算機已經(jīng)安裝了Win7 。

必要條件2:適應(yīng)用戶權(quán)限

  Win7默認運行的是非管理員賬號,權(quán)限相對較小。而軟件的安裝程序會往包括系統(tǒng)盤的Program Files、Windows安裝目錄、注冊表中寫入一些數(shù)據(jù)(軟件在運行時可能會將一些用戶數(shù)據(jù)保存到系統(tǒng)文件夾或注冊表中),如果當(dāng)前用戶的權(quán)限不夠,軟件就無法正常入駐Win7。

  小知識: UAC是一種降低Windows用戶默認權(quán)限的辦法,這樣會給用戶帶來安全性的提高,它可以一定程度上遏制了一些病毒的發(fā)作——關(guān)閉殺毒軟件、啟動復(fù)制及散播病毒進程、注入網(wǎng)游客戶端、監(jiān)聽鍵盤操作從而盜竊密碼。

  例如數(shù)據(jù)看似保存成功,在寫入的地點卻找不到,或者注銷切換到另一個Windows用戶時,無法找到保存的數(shù)據(jù)。引起這類問題的根源是Win7的UAC機制,它降低了Windows用戶的默認權(quán)限,使得一些普通操作無法更改系統(tǒng)設(shè)置及系統(tǒng)保護的文件夾。

  小提示:軟件要結(jié)合系統(tǒng)某些功能時,需要調(diào)用相應(yīng)的API。API調(diào)用得當(dāng)否,對軟件運行非常關(guān)鍵,我們從下期開始結(jié)合Win7酷炫功能,單獨介紹如何正確的調(diào)用。Win7最新的API,有Win7特有的任務(wù)欄個性化快捷菜單(Jump List)、程序圖標輪廓效果(Icon Overlay)、程序圖標進度條效果(Progress Bar)、標簽式縮略圖(Tabbed Thumbnail)和縮略圖工具欄(Thumbnail Toolbar)……

“婚禮”必要的元素

  我們的軟件要順利嫁給Win7,在軟件中要添加以下的元素。

1.代碼檢測操作系統(tǒng)版本號

在軟件中添加判斷操作系統(tǒng)是Win7 或2008 Server的代碼:
C#
      if (Environment.OSVersion.Version > new Version(5, 1))
      {MessageBox.Show("Windows 7 or Windows 2008 Server","Operating System",
                      MessageBoxButtons.OK,MessageBoxIcon.Error);
            return;
      }

2.盡量將數(shù)據(jù)存儲在非系統(tǒng)盤

  軟件不要默認安裝到系統(tǒng)盤,在編寫軟件安裝路徑時,要考慮這個。此外,還需要在軟件中添加修改讀寫注冊表的代碼,使用HKEY_CURRENT_USER\Software下的鍵值作為存儲數(shù)據(jù)的結(jié)點:
        static void Main(string[] args)
        {
            var registryKey = Registry.CurrentUser.CreateSubKey(
                @"Software\test");
            registryKey.SetValue("name", "zswang");
            registryKey = Registry.CurrentUser.OpenSubKey(@"Software\test");
            Console.WriteLine(string.Format("{0}={1}\r\n",
               "name", registryKey.GetValue("name")));
        }

3.提高程序的運行權(quán)限

  如果用戶使用了管理員身份進入系統(tǒng),又希望把軟件安裝在系統(tǒng)盤,又該如何呢?需要判斷用戶權(quán)限的權(quán)限,簡單的解決方案是添加清單文件。在可執(zhí)行文件夾中找到與可執(zhí)行文件相同名字且擴展名.manifest的文件,輸入以下代碼即可:

<?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="test"
     type="win32"/>
  <description>Description of your application</description>
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>