- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
RDP 具有将磁盘从远程用户工作站导出到 RDP 服务器的奇妙能力。据我所知,这不仅仅是一个 windows 资源管理器技巧,而是各种程序都可以使用快捷方式“X:”、“Y:”、“Z:”等...这stack overflow entry在 RDP 磁盘复制中提到了指向 RDP 用户机器的“\tsclient”别名。现在,很明显,如果有 2 个或更多用户,他们每个人都有自己的、不冲突的 tsclient 目的地。
因此,我的问题是:如何从服务中获取所有远程用户共享资源(磁盘)的列表并进行访问?理想情况下,假设有 2 个用户已连接并共享了他们的 C: 驱动器,我会得到如下列表:
感谢帮助!更新:
这是一段有效的代码 ( 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());
}
}
}
最佳答案
我认为您可以使用CreateProcessAsUser
实现此目的,但您需要检索用户 session 的 token ,您可以通过WTSQueryUserToken
来完成。 .
关于windows - 如何从服务访问通过 RDP 映射的磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10058590/
RDP 客户端是否可以启动远程应用程序,然后仅显示该应用程序(而不是桌面)?应用程序将在客户端中全屏显示,如果应用程序关闭, session 将结束。 最佳答案 “备用外壳”doesn't seem
我希望能够在远程机器上运行应用程序时访问某些特定于设备的数据。问题是,如果 RDP 窗口最小化,则此数据不可用。我正在研究的一种解决方案是编写我自己的 RDP 客户端,以便服务器机器始终认为它具有事件
我看过多篇文章讨论如何通过 Visual Studio 配置 RDP 设置、通过 RDP 程序进行凭据缓存,但我们仍然遇到问题。 我还看到过文章说“您需要为 RDP 角色添加端点”——如果我这样做,V
当我通过以下方式登录时,尝试从 RAWMOUSE 结构的 lLastX 和 lLastY 成员更新鼠标位置时RDP,我得到了一些非常奇怪的数字(例如两者都> 30,000)。我在 Windows 7、
我正在 Lync-2013 中进行应用程序共享。我的 ICE-Check 成功完成,并收到重新邀请响应的 ACK,但大约 35-40 秒后,连接终止,收到一条 BYE 消息,指示原因“由于 RDP 堆
我必须更改管理员密码,因为它已通过 RDP 过期。更改后服务器工作正常。 后来我断开了 session ,然后再次启动它,现在我们收到以下错误消息: An authentication error h
我正在尝试从我的网页打开到服务器的 rdp session 。 testrdp .bat 文件中仅包含以下行: mstsc/v:emea-cirrus 发生的事情是该文件只是作为文本文件显示在我的 c
我配置了 P2S VPN,并且能够通过私有(private) IP 地址访问 Hub 虚拟网络中的 Jump-box。 使用相同的 P2S VPN,我无法访问生产订阅中的虚拟机,但我可以直接从 Jum
在我当前工作中正在从事的项目中,我们需要在 azure Web 角色上启用 RDP。我已启用 RDP,但客户端无法连接。我们确认 RDP 端口也已打开。 客户不需要在他/她的机器上安装证书吗? 最佳答
我在 Azure(Windows 10 专业版)上有一个小型服务器。该服务器上只有一项服务(Web 服务 REST),这并不重要:如果该服务关闭几个小时甚至几天,或者有人窃取了数据,也没什么大不了的。
Windows Azure、用于 Web/辅助角色的 RDP 配置成功。一切正常,我可以通过 RDP 连接到服务器。我可以看到登录屏幕、桌面等。但 3..10 秒后一切都卡住了。好像断线了重新连接后一
如何检测远程客户端是否正在运行远程桌面协议(protocol)?它也接受远程桌面连接?? 比如打开一个端口来检测 HTTP 并发送请求、接收请求 header 并在请求 header 中查看有关 HT
Windows Azure、用于 Web/辅助角色的 RDP 配置成功。一切正常,我可以通过 RDP 连接到服务器。我可以看到登录屏幕、桌面等。但 3..10 秒后一切都卡住了。好像断线了重新连接后一
正如主题所说,我尝试在delphi中使用此代码连接到服务器 procedure TmainF.Button1Click(Sender: TObject); var rdp1 : TMsRdpCl
如何检测远程客户端是否正在运行远程桌面协议(protocol)?它也接受远程桌面连接?? 比如打开一个端口来检测 HTTP 并发送请求、接收请求 header 并在请求 header 中查看有关 HT
这是一个研发项目。通过蓝牙将 Windows PC 的桌面传输到手机。我成功地将桌面以 720p 流式传输到我的 Android 手机,但问题是我无法进行直播。通过蓝牙传输的编码和数据需要几毫秒,所以
我想编写一个可以将文件从服务器发送到客户端的应用程序: 使用 Windows 远程桌面从客户端登录服务器。 服务器上的应用程序可以反向连接到客户端,并使用与远程桌面相同的端口向客户端发送多个文件。 客
github issue: VS Code "and still" won't open in a Linux xrdp session Workaround- Linux RDP 会话中无法打开VS
提到远程管理,通常指的是远程管理服务器,而非个人计算机。个人计算机可以随时拿来用,服务器通常放置在机房中,用户无法直接接触到服务器硬件,只能采用远程管理的方式。 远程管理,实际上就是计算机(服务器)之
我的经理向我指出了我们的一个会计应用程序可以做的一些漂亮的事情,因为当在 RDP session 中打开包时,它可以根据主机的机器名称和客户端的机器名称加载不同的设置。 我们希望在我公司的一个应用程序
我是一名优秀的程序员,十分优秀!