2012-12-19 3 views
3

이 질문은 꽤 자주 묻습니다. 그러나 나는 문제가있다. 그래서 저는 별도의 클래스를 만들었습니다. 특히 적절한 사용자 수준이 존재하는지 확인합니다. 다음은 Protected 생성자 파생 클래스 문제

그 권한 수준 테스트하는 코드입니다 : 그래서 그 부분이 의도 한대로 작동

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

나는 당신의 문제가 다른 곳에 있다고 생각한다 : 나는이 두 클래스 정의를 프로젝트에 붙여 넣었다. Elevate()라고하는 새로운 Default_Configuration을 인스턴스화했지만 오류는 발생하지 않습니다.

publicprotected 방법을 혼합하는 데 다른 문제가있는 경우 다음은 문제를 설명하는 blog post by Peter Hallam입니다.

기본적으로 기본 클래스의 protected 인스턴스 메서드는 파생 클래스의 public 인스턴스 메서드에서 호출 할 수 없습니다. 이렇게하면 "악의적 인"파생 클래스가 기본 클래스 에있는 모든 protected 메서드를 래퍼를 작성함으로써 만들 수 있습니다.

+0

이것은 생성자에도 적용됩니까? 공공 생성자가 기본 보호 호출자라고 부를 수 있다고 가정합니다. – Bobson

+0

그래, 나도 궁금 할거야. 게시물 주셔서 감사합니다. – Greg

+0

@Bobson :이 질문에서 코드를 복사 할 때 기본 보호 생성자를 호출하는 공용 생성자가 잘 작동했습니다. – Carson63000

0
 new Default_Configuration().Elevate(); 

이 줄은 저에게 적합합니다.

어떤 점이 효과가 있습니까?