C system()调用在Windows XP上返回“权限被拒绝”

C system()调用在Windows XP上返回“权限被拒绝”,c,windows,windows-xp,C,Windows,Windows Xp,我在Windows XP上运行的一个C程序遇到一个问题,当它试图调用系统时,该程序的权限被拒绝,并出现错误 我在命令字符串中输入的内容似乎并不重要,这些命令都是手动执行的,但通过系统执行时会出现权限拒绝错误 另一件有趣的事情是,该程序在其他XP机器上正常工作,而不是在这台机器上。这让它感觉像是某种操作系统设置,但我不完全确定系统在引擎盖下做了什么,我想了解这里发生了什么 以下是我的测试代码: fprintf( stderr, "DEBUG: Running test of system(NULL

我在Windows XP上运行的一个C程序遇到一个问题,当它试图调用系统时,该程序的权限被拒绝,并出现错误

我在命令字符串中输入的内容似乎并不重要,这些命令都是手动执行的,但通过系统执行时会出现权限拒绝错误

另一件有趣的事情是,该程序在其他XP机器上正常工作,而不是在这台机器上。这让它感觉像是某种操作系统设置,但我不完全确定系统在引擎盖下做了什么,我想了解这里发生了什么

以下是我的测试代码:

fprintf( stderr, "DEBUG: Running test of system(NULL) call...\n" );
if ( ( ret = system( NULL ) ) != 0)
    fprintf( stderr, "  DEBUG: ret: %d: errno: %d, %s\n", ret, errno, strerror( errno ) );

fprintf( stderr, "DEBUG: Running test of system(\"sleep 1\") call...\n" );
if ( ( ret = system( "sleep 1" ) ) != 0 )
    fprintf( stderr, "  DEBUG: ret: %d: errno: %d, %s\n", ret, errno, strerror( errno ) );
这将产生

DEBUG: Running test of system(NULL) call...
  DEBUG: ret: 1: errno: 0, No error
DEBUG: Running Test of system("sleep 1") call...
  DEBUG: ret: -1: errno: 13, Permission denied
谢谢

更新:我还修改了我的代码以使用CreateProcess而不是system,我仍然收到一个拒绝访问错误5。这听起来更像是一个操作系统设置,但我不知道该去哪里找


UPDATE2:Process Monitor显示对路径D:\cmd.exe的QueryOpen的调用失败,该路径不存在。所有其他调用都是针对C:\WINDOWS\system32\cmd.exe的,因此我不知道为什么一个调用不好。

您是否尝试过用它运行程序?Process Monitor将向您显示程序进行的所有系统调用,以及有关调用的许多其他元数据,如它们的参数和返回值。它可以帮助您调试为什么会出现“权限被拒绝”错误。

您确定正确检查了故障吗?作为一个可能的失败。EACCES可能只是在前面代码的errno中

int how_to_test_system(char const* command) {
  int rc;
  switch ((rc = system(command))) {
  case -1: // an error happened in calling system() itself
    perror("system"); // prints "system: <msg>"
    break;

  case 0: // command completed successfully
    break;

  default: // command executed, but had a non-zero return code
    // you might want to log something here
    // (otherwise you can simplify this switch into a single if for -1)
    break;
  }
  return rc;
}

COMSPEC环境变量未正确设置或正在被重写

在中查找COMSPEC 1.内置系统变量

在HKEY_LOCAL_机器配置单元中找到系统变量

在HKEY_当前_用户配置单元中找到局部变量

Autoexec.bat文件中设置的所有环境变量和路径

登录脚本中设置的所有环境变量和路径(如果存在)

在脚本或批处理文件中交互使用的变量

真正的工作原理是在这里。。。

问题终于解决了,原来是后台运行的反病毒服务在某种程度上干扰了事情


感谢大家的帮助。

错误来自于执行命令但返回代码非零的情况。如果命令不为NULL,系统将从MSDN返回命令解释器返回的值,我想这就是我获取EACCES错误的方式。我可以尝试systemNULL,看看它是否有效。@bde:已执行程序的返回码不必是errno常量;它的意思取决于执行的确切程序,除了零表示成功,非零表示某种失败。你有一个简短的测试用例吗?用它更新问题文本。@罗杰,我以前错了,我明白你的意思。我用一个测试用例更新了这个问题,这个测试用例演示了我所看到的情况。我必须对此进行一点实验,看看是否能得到更多的信息。好的,所以在运行process monitor之后,问题似乎是在D:\cmd.exe上调用QueryOpen一次,这是不存在的。所有其他系统调用都是对正常的C:\WINDOWS\system32\cmd.exe的,因此我不知道是什么使它看起来不正确。@bde:您的%PATH%环境变量设置正确吗?我同意COMSPEC环境变量似乎正在被覆盖,但在我运行进程的环境中键入echo%COMSPEC%时,会显示C:\WINDOWS\system32\cmd.exe,这似乎是正确的。如果COMSPEC在创建进程的shell中是正确的,那么它将如何被重写?@bde也就是说,如果您以自己的身份登录-您在上面说您是以系统的身份运行的。a检查系统b中的值,确保没有覆盖上述3、4或5中的COMSPEC