我有一个在本地系统帐户下运行的 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/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢