2012-04-07 7 views
2

RDP hat diese fantastische Fähigkeit, Festplatten von der Arbeitsstation eines entfernten Benutzers auf den RDP-Server exportieren zu lassen. Soweit ich sagen kann, ist es nicht nur ein Windows Explorer Trick, aber alle Arten von Programmen können die Verknüpfungen "X:", "Y:", "Z:" etc ... Diese stack overflow entry auf RDP-Disk kopieren erwähnt den Alias ​​'\ tsclient', der auf den Rechner des RDP-Benutzers verweist. Jetzt ist es offensichtlich, dass wenn es zwei oder mehr Benutzer gibt, sie jeweils eigene, nicht in Konflikt stehende Tsclient-Ziele haben.Zugriff auf die Festplatten, die über RDP von einem Dienst zugeordnet wurden?

Meine Frage ist also: Wie bekomme ich eine Liste von und Zugriff auf alle freigegebenen Ressourcen (Festplatten) von einem Benutzer freigegeben? Im Idealfall, wenn, sagen wir 2 Benutzer verbunden und haben ihre C geteilt: Laufwerke, würde ich eine Liste wie bekommen:

  • \ UserJohnDoe \ VolumeXyzC - John Laufwerk C
  • \ UserJaneRoe \ VolumeXyzC - Janes Laufwerk C

Hilfe geschätzt! UPDATE:

Hier ist ein Arbeits Stück Code (gist snippet)

// rdpjoker by Konrads 

#include "stdafx.h" 
#define SERVER "XXX.compute-1.amazonaws.com" 
#define CMD "cmd.exe /C dir \\tsclient\\c >output.txt" 

int main(int argc, char **argv){ 
    HANDLE server; 
    PWTS_SESSION_INFOA ppSessionInfo=NULL; 
    WTS_SESSION_INFOA pSessionInfo; 
    DWORD pCount; 
    DWORD pLevel=1; 
    DWORD i=0; 
    LPSTR ppBuffer; 
    DWORD bytesReturned;  
    HANDLE userToken=NULL; 
    HANDLE pUserToken=NULL; 
    ULONG sessionid; 
    DWORD dwCreationFlags=0; 
    LPVOID environment=NULL; 
    STARTUPINFOA si; 
    PROCESS_INFORMATION pi; 
    char *cmdline; 
    char *username; 
    char *homedir;//[MAX_PATH]; 
    char desktop[8192]; 

    server=WTSOpenServerA(WTS_CURRENT_SERVER_NAME); 
    if(argc>2){ 
     sessionid=atol(argv[1]); 
     printf("[*] Impersonating session: %i\n",sessionid); 
     if(WTSQueryUserToken(sessionid,&userToken)){ 
      //if(DuplicateTokenEx(userToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary,&pUserToken)){ 
       if(CreateEnvironmentBlock(&environment,pUserToken,FALSE)){ 
        ZeroMemory(&si, sizeof(STARTUPINFO)); 
        //WTSQuerySessionInformationA(server,sessionid,WTSWinStationName,&ppBuffer,&bytesReturned); 
        //sprintf_s(desktop,8192,"%s\\default",ppBuffer); 
        si.lpDesktop = "winsta0\\default";; 
        si.cb=sizeof(STARTUPINFO); 
        //WTSFreeMemory(ppBuffer); 
        ZeroMemory(&pi,sizeof(pi)); 
        cmdline=(char *)malloc(MAX_PATH +1); 
        //GetUserProfileDirectoryA(userToken,homedir,&bytesReturned); 
        //WTSUserConfigTerminalServerProfilePath 
        //WTSQuerySessionInformationA(server,sessionid,WTSUserName,&ppBuffer,&bytesReturned); 
        WTSQuerySessionInformationA(server,sessionid,WTSUserName,&ppBuffer,&bytesReturned); 

        username=_strdup(ppBuffer); 
        WTSFreeMemory(ppBuffer); 
        //WTSQueryUserConfigA(WTS_CURRENT_SERVER_NAME,username,WTSUserConfigTerminalServerProfilePath,&ppBuffer,&bytesReturned); 
        homedir=(char *)malloc(MAX_PATH); 
        sprintf_s(homedir,MAX_PATH,"C:\\Users\\%s\\",username); 
        //homedir=_strdup(ppBuffer); 
        //WTSFreeMemory(ppBuffer); 
        printf("[D] homedir: %s\n",homedir); 
        sprintf_s(cmdline,MAX_PATH,"cmd.exe /C dir %s >output.txt",argv[2]); 
        dwCreationFlags|= CREATE_UNICODE_ENVIRONMENT | NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE; 

        //WTSQuerySessionInformationA(server,sessionid,WTSWinStationName,&ppBuffer,&bytesReturned); 
        //printf("station: %s",ppBuffer); 


        if(CreateProcessAsUserA(userToken, 
         NULL, 
         cmdline, 
         NULL, 
         NULL, 
         FALSE, 
         dwCreationFlags, 
         environment, 
         homedir, 
         &si, 
         &pi)){ 
          printf("[*]CreateProcessAsUserA succeeded! pid:%i, tid:%i\n",pi.dwProcessId,pi.dwProcessId); 
        }else{ 
         printf("[E] CreateProcessAsUserA failed: %i\n", GetLastError()); 
        } 


       //}else{ 
        //printf("[E] CreateEnvironmentBlock failed: %i\n", GetLastError()); 
     //  } 
     }else{ 
        printf("[E] DuplicateTokenEx failed: %i\n", GetLastError()); 
       } 


     } 
     else{ 
      printf("[E] WTSQueryUserToken failed: %i\n", GetLastError()); 
      exit(-1); 
     } 
    } 

    else{ // no arguments specified 
     if(WTSEnumerateSessionsA(server,0,1,&ppSessionInfo,&pCount)){ 

      // printf("pCount: %i,",pCount); 
      for (i=0;i<pCount;++i){ 
       // printf("i = %i\n",i); 
       pSessionInfo=ppSessionInfo[i]; 
       printf("Session ID: %i; name: %s, ",pSessionInfo.SessionId,pSessionInfo.pWinStationName); 
       if(WTSQuerySessionInformationA(server,pSessionInfo.SessionId,WTSUserName,&ppBuffer,&bytesReturned)){ 
        printf("user: %s, ",ppBuffer); 
        WTSFreeMemory(ppBuffer); 
       }else{ 
        printf("WTSQuerySessionInformation[WTSUserName] failed: %i\n", GetLastError()); 
       } 
       if(WTSQuerySessionInformationA(server,pSessionInfo.SessionId,WTSWinStationName,&ppBuffer,&bytesReturned)){ 
        printf("station: %s",ppBuffer); 
        WTSFreeMemory(ppBuffer); 
       }else{ 
        printf("WTSQuerySessionInformation[WTSWinStationName] failed: %i\n", GetLastError()); 
       } 
       printf("\n"); 
      } 
      WTSFreeMemory(ppSessionInfo); 
     }else //0014fb3c 
     { 
      printf("EnumerateSessions failed: %i\n", GetLastError()); 
     } 
    } 
} 

Antwort

2

Ich glaube, Sie dies mit CreateProcessAsUser erreichen können, aber Sie müssen das Token für die Sitzung des Benutzers abgerufen werden, die Sie über WTSQueryUserToken tun.

+0

Ich gebe es eine Chance. Aber sicher, irgendwo in Windows sollte es einen UNC-Pfad geben, der dies absolut nicht über den relativen \\ tsclient – Konrads

+0

@Konrads Ich glaube, das Problem ist, dass Terminal-Dienste der Netzwerk-Provider in diesem Fall ist, aber es bietet nur Vernetzung mit der 'tsclient' Computername. – Neil

+0

Aber wie weiß es :)? Gibt es einen Haken im System, der die UNC-Auflösung abhängig vom Benutzernamen ändert? – Konrads