2011-03-31 82 views
0

好了,因爲在XP中大多數人都以管理員身份登錄 - 程序員可以很容易地使程序與註冊表一起工作。我想要做的是這樣的:針對Windows 7註冊表操作限制的解決方法?

該軟件已啓動,並作爲啓動過程添加到註冊表中,但只有在應用程序關閉時纔會執行 - 而不是之前。

但是,這在xp中不起作用,當用戶在vista,7,2008中受限制和相同的情況下。

解決方法是什麼?我正在考慮讓程序創建一個預定的任務,或者附加到一個更高權限的進程?任何工作方式?因爲我的軟件與.net相關 - 實際上同樣的事情發生在C++中 - 但我暗中希望網絡提供更簡單的方法來解決它。 提前10倍!

+0

我不知道爲什麼這不會發生在**安裝**。這是應用程序將自己註冊爲啓動進程的最佳時機,因爲安裝程序已經作爲具有管理權限的提升進程運行。目前還不清楚爲什麼你必須能夠在飛行中做到這一點。(但爲了以防萬一,下面我的答案提供了一個解決方案。) – 2011-04-01 00:36:40

回答

0

限制用戶的全部用途是爲了防止這種情況。

+2

這不是爲了防止它,而是讓用戶知道你將要惹惱私人部分。 – 2011-04-01 01:34:05

+0

@leo然後你應該註冊爲啓動過程只爲當前用戶,而不是整個系統。要做到這一點,只需像@Mark所說的那樣添加一個[HKCU入口](http://stackoverflow.com/questions/5507818/workaround-against-registry-manipulation-limitation-in-windows-7/5508034#5508034)。 – 2011-04-01 06:05:13

+0

@Hans在XP有限的用戶被限制訪問。在Windows 7中,他們與UAC一起在出現內亂時警告你。 – m4tt1mus 2011-04-01 18:39:39

5

恩,這不是Windows 7的限制;它實際上是通過設計。 See my answer here瞭解詳情。

你需要什麼叫做進程標高。這是處理這種問題的標準方式,UAC中內置了一種機制,允許用戶以管理員身份進行身份驗證,並暫時獲得此標題附帶的所有特權和責任。 Windows本身使用這一切的地方:

Example of elevation shield displayed in Windows UI

有一個夢幻般的如何,在這裏提供的文章:Shield icons, UAC, and process elevation in .NET
但只是在鏈接腐爛的情況下總結,這裏的步驟:

  1. 確定用戶是否具有相應的權限了。最簡單的方法是調用IsUserAnAdmin API函數。

  2. 使用「屏蔽」圖標通知用戶需要提升。在WinForms中,您需要將按鈕的FlatStyle屬性設置爲「System」,並使用P/Invoke來顯示屏蔽。示例代碼:

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, 
                 IntPtr wParam, IntPtr lParam); 
    
    public const int BCM_SETSHIELD = 0x0000160C; 
    
    public static void SetButtonShield(Button btn, bool showShield) 
    { 
        // Verify that we're running on Vista or later 
        if ((Environment.OSVersion.Platform == PlatformID.Win32NT) && 
         (Environment.OSVersion.Version.Major >= 6)) 
        { 
         SendMessage(btn.Handle, BCM_SETSHIELD, IntPtr.Zero, 
            showShield ? new IntPtr(1) : IntPtr.Zero); 
        } 
    } 
    
  3. 以管理員權限重新啓動進程。這涉及顯示提升對話框以允許用戶提升程序。示例代碼:

    ProcessStartInfo psi = new ProcessStartInfo 
              { 
               Arguments = "-justelevated", 
               ErrorDialog = true, 
    
               // Handle is the handle for your form 
               ErrorDialogParentHandle = Handle, 
               FileName = Application.ExecutablePath, 
               Verb = "runas" 
              }; 
    try 
    { 
        Process.Start(psi); 
        Close(); 
    } 
    catch (Exception ex) 
    { 
        // the process couldn't be started. This happens for 1 of 3 reasons: 
    
        // 1. The user cancelled the UAC box 
        // 2. The limited user tried to elevate to an Admin that has a blank password 
        // 3. The limited user tries to elevate as a Guest account 
        MessageBox.Show(ex.Message); 
    } 
    
  4. [可選] Code sign您的應用程序更合意的灰色或藍色,以取代敵對,面色發黃UAC提升箱。

1

它應該是每個用戶,然後你將不會有權限問題。 HKCU \軟件\微軟\的Windows \ CurrentVersion \運行

相關問題