2012-12-19 77 views
3

我確信這個問題已經被問了很多次;但是我遇到了一個問題。所以我創建了一個單獨的課程;特別是驗證適當的用戶級別是否存在。受保護的構造函數派生類問題

下面是測試這些權限級別的代碼:

class Elevated_Rights 
    { 

     // Token Bool: 
     private bool _level = false; 

     #region Constructor: 

     protected Elevated_Rights() 
     { 

      // Invoke Method On Creation: 
      Elevate(); 

     } 

     #endregion 

     public void Elevate() 
     { 

      // Get Identity: 
      WindowsIdentity user = WindowsIdentity.GetCurrent(); 

      // Set Principal 
      WindowsPrincipal role = new WindowsPrincipal(user); 

      #region Test Operating System for UAC: 

      if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6) 
      { 

       // False: 
       _level = false; 

       // Todo: Exception/ Exception Log 

      } 

      #endregion 

      else 
      { 

       #region Test Identity Not Null: 

       if (user == null) 
       { 

        // False: 
        _level = false; 

        // Todo: "Exception Log/Exception" 

       } 

       #endregion 

       else 
       { 

        #region Ensure Security Role: 

        if (!(role.IsInRole(WindowsBuiltInRole.Administrator))) 
        { 

         // False: 
         _level = false; 

         // Todo: "Exception Log/Exception" 

        } 

        else 
        { 

         // True: 
         _level = true; 

        } 

        #endregion 


       } // Nested Else 'Close' 

      } // Initial Else 'Close' 

     } // End of Class. 

    } 

所以這部分工作爲目的;但是,當我將這個類繼承到另一個類來利用受保護的構造函數時,我碰到了一個障礙。

class Default_Configuration : Elevated_Rights 
    { 

     #region Constructor: 

     public Default_Configuration() : base() 
     { 


      Elevate(); 


     } 

     #endregion 



    } 

但是,當我叫這個新班;該方法指出:「由於構造器權限導致無效訪問」。理論上應該工作;有什麼我失蹤?任何幫助將不勝感激。

+0

「該方法狀態....」?這聽起來像是一個運行時,而不是編譯器的問題......您是否使用Lazy 或類似在運行時構造實例的東西? –

+3

你確實意識到你會按照目前的寫法來調用'Elevate()'兩次嗎? – Bobson

+0

你可以發佈調用代碼嗎? –

回答

2

我認爲你的問題在於別處:我將這兩個類定義粘貼到一個項目中,構建得很好。實例化一個新的Default_Configuration,名爲Elevate(),沒有錯誤。

如果您在混合publicprotected方法時遇到其他問題,則可以使用blog post by Peter Hallam來描述這些問題。

基本上,您不能在派生類中的public實例方法的基類中調用protected實例方法;這樣做會允許「惡意」派生類僅通過爲它們編寫包裝來製作基類public中的所有protected方法。

+0

這也適用於構造函數嗎?我假設一個公共構造函數可以調用一個基本保護的構造函數。 – Bobson

+0

是的,我也很好奇。感謝這篇文章。 – Greg

+0

@Bobson:當我複製這個問題的代碼時,調用基類保護構造函數的公共構造函數對我來說工作得很好。 – Carson63000

0
 new Default_Configuration().Elevate(); 

這條線適合我。

什麼不適合你?

相關問題