2013-03-12 2 views
2

WMI 개체의 두 가지 메서드를 호출하기 위해 상승 된 권한으로 실행해야하는 프로그램을 작성했습니다. "상승 된 모드"에서 관리자 그룹의 사용자가 실행하는 경우 매력처럼 작동합니다. 하지만 이제 문제는 모든 사람이 실행해야하며 모든 사람이 자신이 작업하는 컴퓨터에 대한 관리자 권한이있는 것은 아닙니다. 그래서 프로그램을 다시 시작하여 "Domain Admins"그룹에서 사용자를 사칭하기로 결정했습니다. UAC가 활성화되면"Win32Exception : 디렉터리 이름이 잘못되었습니다."가장 및 UAC

ProcessStartInfo proc = new ProcessStartInfo(); 
proc.WorkingDirectory = Environment.CurrentDirectory; 
proc.FileName = System.Windows.Forms.Application.ExecutablePath; ; 
proc.UserName = "USERNAME"; 
SecureString secure = new SecureString(); 
foreach (var item in "PASSWORD") 
{ 
    secure.AppendChar(item); 
} 
proc.Password = secure; 
proc.Domain = "DOMAIN"; 
proc.UseShellExecute = false; 
proc.Verb = "runas"; 
Process.Start(proc); 

는 두 가지 문제가 있습니다 : 다음과 같이 그에 대한

내 코드입니다. 먼저 가장하는 사용자를 프로그램의 설치 폴더 ACL에 명시 적으로 추가하지 않은 경우 (사용자가 이미 폴더와 모든 파일에 대한 모든 액세스 권한을 가진 Administrators 그룹에 있음)에는 System.ComponentModel.Win32Exception: The directory name is invalid이 표시됩니다. 나는 디렉토리 경로를 두 번 확인했는데 실제로 유효하다 (그리고 사용자가 명시 적으로 ACL에있을 때 작동한다).

사용자가 명시 적으로 추가되고 예외가없는 경우 프로그램은 사용자 권한으로 실행되지만 권한은 상승하지 않으므로 호출이 작동하지 않습니다.

내가 뭘 잘못하고 있니? 당신의 도움을 주셔서 감사합니다.

이미 비슷한 문제에 대한 몇 가지 질문이 있지만 솔루션/응답 중 아무 것도 내 문제를 해결하지 못했거나 너무 오래 상세하지 않고 비활성 상태였습니다.

+0

, 이것은이다 모든 시도는 UAC를 우회합니다. 그것이 맞다면 바이 ​​패싱되지 않도록 설계된 것을 우회하려고합니다. –

+0

@AbqBill 낮은 권한으로 실행되는 프로그램이 도메인 관리자의 로그인을 사용하여 높은 권한으로 다시 시작될 수없는 것은 확실합니까? 서비스를 만들고 프로세스 간 통신을 통해 서비스를 실행하게해야합니까? – mgttlinger

+0

잠재적 인 (그리고 매우 사소한) 공격 벡터가 될 수 있기 때문에 가능하다면 놀랄 것입니다. 또한 SO에서 UAC 태그를 확인하고 FAQ별로 정렬하십시오 (자주 묻습니다). 귀하의 솔루션 (상승 된 서비스를 생성)은 나에게 합리적인 해결책으로 보입니다. –

답변

2

나는 동일한 문제를 겪어 왔으며, 나는 향상시킬 수 없었고 동시에 자격 증명을 제공 할 수 없었다. 'runas'동사를 사용하려면 UseShellExecute = true로 설정해야하지만 자격 증명을 제공하려면 false로 설정해야합니다. 내가 관리자 권한을 테스트하고 존재하지 않는 경우 로컬 관리자 권한을 가진 별도의 사용자로 내 응용 프로그램을 다시 시작합니다. 그런 다음 프로세스를 실행합니다. 'runas'동사로 시작하고 자격 증명을 제공 할 필요가 없습니다. 이 시점에서 사용자는 UAC 프롬프트를 받게되고 예를 선택하면 프로세스가 상승됩니다. 나는 VB에서 광산을 쓴하지만 아이디어는 내 코드의 IsUserAdminGroup가에서 사용되는 여기에, 동일 : 난 당신이 뭘 하려는지 이해한다면

UAC self-elevation


 Try 
    'check if user is administrator 
    Dim fInAdminGroup As Boolean = Me.IsUserInAdminGroup 
    If (Me.IsUserInAdminGroup = False) Then 
    'check if process is running under user you want to elevate 
     If Not (System.Environment.UserName = "") Then 
    'this process restarts the app as the desired admin user 
      Dim path As String = Environment.CurrentDirectory 
      Dim filename As String = Application.ExecutablePath 
    'create secure string password 
      Dim passwordPre As String = "" 
      Dim passwordChars As Char() = passwordPre.ToCharArray() 
      Dim password As New SecureString() 
      For Each c As Char In passwordChars 
       password.AppendChar(c) 
      Next 
      Dim procInfo As New System.Diagnostics.Process 
      procInfo.StartInfo.FileName = filename 
      procInfo.StartInfo.UserName = "" 
      procInfo.StartInfo.Domain = "" 
      procInfo.StartInfo.Password = password 
      procInfo.StartInfo.UseShellExecute = False 
    'load user profile was needed for a legacy application I used that failed without the user hive loaded 
      'procInfo.StartInfo.LoadUserProfile = True 
      procInfo.StartInfo.CreateNoWindow = True 
      procInfo.StartInfo.WorkingDirectory = path 
      procInfo.Start() 
      Application.Exit() 
     Else 
      MsgBox("Unable to open, call support.", MsgBoxStyle.Critical, "Run Failed") 
      Application.Exit() 
     End If 
    ElseIf (System.Environment.UserName = "") Then 
     Me.Visible = False 
     Me.Hide() 
    'this process starts the desired app elevated 
     Dim procInfo As New System.Diagnostics.Process 
     procInfo.StartInfo.FileName = "ptpublisher.exe" 
     procInfo.StartInfo.Verb = "runas" 
     procInfo.StartInfo.UseShellExecute = True 
     procInfo.StartInfo.CreateNoWindow = True 
     procInfo.StartInfo.WorkingDirectory = "C:\Program Files (x86)\Primera Technology\PTPublisher" 
     procInfo.StartInfo.Arguments = "" 
     procInfo.Start() 
     Application.Exit() 
    End If 
Catch ex As Exception 
    MsgBox(ex.Message, MsgBoxStyle.Critical, "Run Failed") 
    Application.Exit() 
End Try 
관련 문제