这确实很奇怪。
如果我直接打开命令提示符窗口(在开始中搜索cmd,右键单击>在这里打开命令窗口,cmd在bat文件中等....)输入的所有命令都运行良好。
如果我从我的c++应用程序(system("cmd");
或QProcess::startDetached("cmd");
等....)中打开命令提示符窗口,我输入的命令抛出错误。
下面是一些在我的应用程序打开的cmd中不起作用的命令:
vssadmin delete shadows /all
vssadmin list shadows
wmic
shadowcopy
等等…我得到了Class not registered
和Initialization failure
的错误。任何与影子拷贝有关的东西都不起作用。但是,同样奇怪的是,当传统地打开cmd(不是从程序)时,这些相同的命令工作得很好。cmd的两个实例都具有admin权限。
所以我的问题是,为什么我打开cmd的方式会影响一些命令是否工作?
在WOW64上运行的32位应用程序将被置于文件系统重定向下。因此,如果你的应用程序是32位的,调用system("c:\windows\system32\cmd.exe");
将被重定向到C:WindowsSysWOW64cmd.exe
, 32位的cmd将始终被调用。你有一些解决方案:
- 使用
system("c:\windows\sysnative\cmd.exe");
访问真正的system32文件夹并获得64位cmd - 显式关闭文件系统重定向(一般应避免)
- 或者最好将其编译为64位应用。