2010-12-20 4 views
1

나는 문제가있다. 나는 오른쪽 클릭으로 프로그램을 시작한다. -> 관리자 권한으로 실행한다. 프로그램이 관리 컨텍스트에서 실행 중임을 의미합니다.현재 로그인 한 사용자 얻기 (FullToken Context)

WindowsIdentity.GetCurrent().Name; 

나는 사용자가 내가 관리자로 programm에를 시작한 사용자를 얻을 것이다 그런 식으로 이름을 얻으려고한다면 ..하지만 내가 필요한 것은 현재 로그인 한 사용자의 이름입니다 예를 들어 "관리자"를하는 예를 들면 다음과 같습니다. bob

아무도 도와 줄 수 있습니까? :)

답변

0

은 어쩌면 당신은 같은 일반 사용자를 시작할 수를 사용자 이름을 저장 한 다음 프로그램 요청 고도 :

Windows 7 and Vista UAC - Programmatically requesting elevation in C#

+0

나는 이것이 가장 (impersonation)을 통해 가능할 수 있음을 알고 있습니다. 그래서 다른 방법은 없을까요? – Lars

+0

다른 방법에 대해서 모르겠다. 이것은 파일을 작성하기 위해 관리자 액세스 권한이 필요하기 때문에 설치 중에도 자주 발생하는 문제이지만 정확한 사용자 경로 (/ docs 및 설정/사용자 이름/etc)를 얻으려면 사용자 액세스가 필요합니다. ...?!? .. 그것은 버그가 아니며 기능입니다 ... –

+0

:) 아니요 제가로드 한 모든 레지스트리를 언로드하려고하지만 제가 일종의 참조로 사용하는 로컬 사용자의 레지스트리가 아닙니다. 그래서 나는 이것이 어떤 것인지 알아 내야합니다. – Lars

0

모든 .NET 라이브러리는 현재 컨텍스트 (사용자의 경우 'Administrator')에서 사용자를 제공합니다. 당신은 explorer.exe 프로세스의 소유자를 얻기 위해 WMI (System.Management.dll)를 사용하여 시도 할 수 Security in the .NET framework

4

: 당신은 당신의 코드를 확보하려는 경우

, 당신은에 대한 책을 읽은 고려할 수 있습니다.

string GetExplorerUser() 
{ 
    var query = new ObjectQuery(
     "SELECT * FROM Win32_Process WHERE Name = 'explorer.exe'"); 

    var explorerProcesses = new ManagementObjectSearcher(query).Get(); 

    foreach (ManagementObject mo in explorerProcesses) 
    { 
     string[] ownerInfo = new string[2]; 
     mo.InvokeMethod("GetOwner", (object[])ownerInfo); 

     return String.Concat(ownerInfo[1], @"\", ownerInfo[0]); 
    } 

    return string.Empty; 
} 

이 탐색기 프로세스가 이렇게 서로 다른 사용자 자격 증명으로 실행 여러 탐색기 프로세스를 가진 가능성과 함께 끝나지 않는 단일 인스턴스라는 사실에 의존한다.

+0

각 세션이 자신의 explorer.exe 프로세스를 가질 수있는 터미널 서비스는 어떻습니까? –

+0

나는 그 맥락에서 너를 도울 수는 없을까 걱정된다. –

+0

정확히 내가 무엇을 찾고 있었습니까! –

0

1) Cassia은 RDC를 비롯하여 현재 로그인 한 사용자의 목록을 제공 할 수 있어야합니다. SO answer

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions()) 
{ 
    // sess.SessionId 
    // sess.UserName 
} 

2) WMI() WTSEnumerateSessions

4) "explorer.exe를"의 모든 인스턴스를 열거의 PInvoke를 사용하여 소유자를 얻을

Select * from Win32_LogonSession 

3)의 PInvoke (OpenProcessHandle) .

Process[] processes = Process.GetProcessesByName("explorer"); 

이것은 약간 해킹입니다. WMI도이 용도로 사용할 수 있습니다.

WMI를 사용하는 솔루션을 사용하기로 결정한 경우 winmgmt을 서비스 종속성으로 설정하는 것이 좋습니다.

관련 문제