- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个在本地系统帐户下运行的 Windows 服务,它使用 DefineDosDevice 函数创建 DOS 设备。该服务在 W2K8 远程桌面服务器上运行。如果设备是使用服务的凭据创建的,则它们是在 GLOBAL 设备 namespace 中创建的,因此对所有用户可见。我需要仅对特定交互 session 可见的设备。
我通过模拟我希望驱动器出现在其 session 中的用户来完成此操作。这非常简单,前提是 session ID 可用。这是我编写的一个简单的测试应用程序来说明问题:
int _tmain(int argc, _TCHAR* argv[])
{
BOOL result = TRUE;
if(argc > 3 && !wcscmp(argv[2], L"/i"))
{
HANDLE hToken = 0;
DWORD dwSessionId = _wtoi(argv[3]);
result = WTSQueryUserToken(dwSessionId, &hToken);
if(result) result = ImpersonateLoggedOnUser(hToken);
}
if(result)
{
LPTSTR drive = argv[1];
DefineDosDevice(DDD_REMOVE_DEFINITION, drive, NULL);
result = DefineDosDevice(0, drive, L"C:\\test");
}
if(!result)
{
printf("Error: %d\n", GetLastError());
}
return 0;
}
为了测试这段代码,我创建了一个在本地系统帐户下启动命令 shell 的服务:
sc create test_svc binpath= "cmd /K start" type= own type= interact
此服务无法启动,但在失败之前,它会生成一个在 LocalSystem 帐户下运行的命令 shell。
我从 LocalSystem cmd.exe 运行:
MySubst.exe x: /i 2
调用 ImpersonateLoggedOnUser(),然后调用 DefineDosDevice()
在用户 session 中运行的 cmd.exe 中,我运行:
MySubst.exe y:
调用 DefineDosDevice 而不调用 ImpersonateLoggedOnUser()。
这行得通。从 cmd.exe 我可以访问两个驱动器 X: 和 Y:。我可以从开始菜单启动 notepad.exe,然后看到 X: 和 Y: 驱动器。此外,如果我与其他用户创建新的终端服务 session ,我看不到 X: 或 Y:。
但是,资源管理器仅在“所有计算机”下显示 Y: 驱动器。 Y:是通过在目标 session 中运行的 cmd.exe 运行我的测试应用程序而创建的驱动器,即未完成模拟。如果我从任务管理器重新启动 explorer.exe,X: 和 Y: 驱动器都会显示。
我还使用了 SysInternals 的 WinObj.exe 来检查定义的 Win NT 设备。我看到的是:
- Sessions
- 0
- DosDevices
00000000-000057607
(57607 是与我正在模拟的 session 关联的登录 session 的 ID)
“00000000-000057607”的内容是:
Global SymbolicLink \Global??
X: SymbolicLink \\??\C:\test
Y: SymbolicLink \\??\C:\test
根据 WinObj,这两个 dos 设备是相同的。它们属于同一个 session 和登录 session 。它们是指向同一 NT 对象的符号链接(symbolic link)。
怎么可能其中一个出现在资源管理器中而另一个没有。
最佳答案
@arx 和@HarryJohnston 赚了钱。如果我从与资源管理器相同的 session 中的线程广播 WM_DEVICECHANGE 消息,新驱动器将出现在我的电脑中。这是代码:
DWORD recipients = BSM_ALLDESKTOPS | BSM_APPLICATIONS;
DEV_BROADCAST_VOLUME msg;
ZeroMemory(&msg, sizeof(msg));
msg.dbcv_size = sizeof(msg);
msg.dbcv_devicetype = DBT_DEVTYP_VOLUME;
msg.dbcv_unitmask = 1 << ('X' - 'A');
long success = BroadcastSystemMessage(0, &recipients, WM_DEVICECHANGE, DBT_DEVICEARRIVAL, (LPARAM)&msg);
关于windows - 为什么在模拟 session 中定义的 DOS 设备没有出现在资源管理器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14866008/
在MS-DOS中,如果输入dir *.pdf,我将在目录中获取所有PDF文件。除了PDF文件,有什么方法可以获取所有内容?像dir !*.pdf一样? 谢谢! 最佳答案 我认为findstr有一个/v
我们如何在 DOS 中实现递归目录列表? 我正在 DOS 中寻找一个命令或脚本,它可以为我提供类似于 Unix 中的 ls -R 命令的递归目录列表。 最佳答案 您可以使用: dir /s 如果您需要
当我使用 ren "C:\folder\file""C:\folder\file.txt" 出现错误“命令的语法不正确。” 但是如果我 CD 到文件夹并使用 ren "file""file.txt"
比如,我能不能做 回显 3 + 5 并得到 8? 是否可以使用日期进行计算? 最佳答案 您可以使用set/a 来计算数学表达式: set /a x=3+5 echo %x% 编辑:这是一行: @for
我正在寻找一个 DOS 脚本来删除根目录中的所有文件和子目录,但根目录中的一组批处理文件 (*.bat) 除外。任何 DOS 运动员都知道一种简单的方法来做到这一点? 更新 谢谢大家的帮助。这就是我现
如何在目录及其子目录中搜索文件并以简洁的格式显示文件名及其创建时间。 我尝试了dir sam.csv/b/s/a-d 但是不起作用。 输出应该如下所示 c:\Data\Sam.txt 10/10/20
我有一个在并发 DOS 3.1 上运行的软件,我使用 QEMU 5.1 对其进行模拟。 在此程序中,有多个打印数据的选项。问题是到达我的主机的数据与发送的数据不对应。 启动qemu的命令: qemu-
我有一个在并发 DOS 3.1 上运行的软件,我使用 QEMU 5.1 对其进行模拟。 在此程序中,有多个打印数据的选项。问题是到达我的主机的数据与发送的数据不对应。 启动qemu的命令: qemu-
在 C 中,我如何写入特定的内存位置,例如视频内存 b800,在 DOS 下(真正的 DOS,MS DOS 6.22) 我知道 C 没有内置任何东西可以做到这一点,但可能有一些特定于平台的东西,例如可
我有一个大约 15 年前购买的非常古老的应用程序,它由 5 个 .exe 文件组成,用于存储患者的个人资料和信息。问题是该应用程序被编程为在特定计算机上运行。 由于我对破解知之甚少,我尝试使用 win
这个问题已经有答案了: How to redirect stderr to null in cmd.exe (1 个回答) 已关闭 4 年前。 我想抑制在 DOS 下运行的脚本的输出,类似于 *nix
我想从 MATLAB 在 dos 中执行一个批处理文件,并立即将控制权返回给 MATLAB。但是,我想在不打开 dos 窗口的情况下执行此操作(或者,至少,让 dos 窗口在最后消失)。 如果我这样格
最初... 我在 10 年前(大学)开始用 C 编程。我使用的 IDE 是 Turbo C++ IDE。 我所有的 c 程序都是 16 位的。 内存模型:巨大。 图形:4 位(16 色)。 图形驱动:
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 11 年前关闭。 Improve this
我需要一个批处理文件中的脚本,当我运行它时,它会将我昨天的日期放入一个变量中。包括 3 月 1 日等条件(根据年份可能是 2 月 28 日或 29 日) 最佳答案 假设您的意思是 ms-dos 批处理
我有一个可以做几件事的批处理文件。如果其中一个失败,我想退出整个程序。例如: @echo off type foo.txt 2>> error.txt >> success.txt mkdir bob
我正在尝试编写一个批处理脚本,将多个 css 文件合并到一个文件中。到目前为止,我已经想出了这个...... # Set start folders & files set fn1=filename.
我有不同的文件夹,例如:a、b、c 等,每个文件夹都有不同的文件,例如:x、y、z 等。 文件 x,y,z 位于每个文件夹中。有没有办法使用单个命令从不同文件夹复制每个文件?我希望结果是所有文件夹中的
我需要获取命令行输出的第一行而不是所有行,例如,如果我给 C:\Temp> dir 我只需要显示第一行, 11/15/2012 06:58 PM
如何使用 dos 批处理文件命令将日期设置为当前日期。 最佳答案 如果您需要在批处理文件中使用当前日期,则变量 %date% 具有当前日期: echo %date% 23/02/2010 它使用您计算
我是一名优秀的程序员,十分优秀!