【问题标题】:Delphi Executing command line commandDelphi 执行命令行命令
【发布时间】:2010-12-03 14:43:26
【问题描述】:

我正在尝试从我的 Delphi 应用程序中运行命令行命令。

ShellExecute(Form1.Handle, 
             'open', 
             'cmd.exe',
             'icacls "C:\ProgramData\My Program\File" /grant Users:F',
             nil,
             SW_NORMAL);

注意:该命令本身可以完美运行。

但是,当我在 Delphi 中运行此代码时,我会弹出命令窗口,但我要执行的命令没有运行,甚至没有出现在命令窗口中。

知道我缺少什么吗?

【问题讨论】:

  • cacls 不是 DOS 命令
  • 甚至“dir”都不是。 DOS 不是现代 Windows 系统的一部分。不过,“dir”是命令行命令或系统命令。
  • 另外,你应该使用SW_SHOWNORMAL
  • 好吧,最好不要乱用 ProgramData 中的权限并遵循平台指南!
  • @Tim:您没有设置“写入”(“M”,修改)权限。您正在设置“完全控制”(“F”)权限。再一次,看起来你不知道区别。如果文件在用户之间共享,则更重要的是要避免一个用户损坏将由另一个用户使用的文件。您还更改了文件的权限,因为“并非所有人都可以访问 HKLM”,但您也可以设置注册表项的权限(尽管与文件和目录一样,您应该非常小心地更改它们的权限)。允许对 的无限制写访问也是不好的。

标签: delphi command-line shellexecute


【解决方案1】:

命令字符串前面需要一些东西。

/c - 将导致它运行

/k - 将导致它运行并且完成后不会消失

【讨论】:

    【解决方案2】:

    您无需创建 shell 即可运行此类命令。它是控制台可执行文件,您可以使用 CreateProcess() 直接运行它。调用 shell 只是意味着调用一个可执行文件 (cmd.exe) 并让它调用另一个或多或少与您直接调用它的方式相同。您只需花时间创建两个流程而不是一个流程。恕我直言,这是一种糟糕的编程习惯,只是表明调用者不知道 Windows 是如何工作的;)

    【讨论】:

      【解决方案3】:

      您使用的是哪个操作系统?我很确定这样的命令需要在 XP 之后的任何 Windows 平台上进行提升。

      这是我用于在 Vista/Windows 7 下提升进程的代码

      uses
        Windows, ShellAPI, Registry;
      
      type
        TExecuteFileOption = (
          eoHide,
          eoWait,
          eoElevate
        );
        TExecuteFileOptions = set of TExecuteFileOption;
      
      ...
      
      function IsUACActive: Boolean;
      var
        Reg: TRegistry;
      begin
        Result := FALSE;
      
        if CheckWin32Version(6, 0) then
        begin
          Result := FALSE;
      
          Reg := TRegistry.Create;
          try
            Reg.RootKey := HKEY_LOCAL_MACHINE;
      
            if Reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System') then
            begin
              if (Reg.ValueExists('EnableLUA')) and (Reg.ReadBool('EnableLUA')) then
                Result := TRUE;
            end;
          finally
            FreeAndNil(Reg);
          end;
        end;
      end;
      
      function ExecuteFile(Handle: HWND; const Filename, Paramaters: String; Options: TExecuteFileOptions): Integer;
      var
        ShellExecuteInfo: TShellExecuteInfo;
        ExitCode: DWORD;
      begin
        Result := -1;
      
        ZeroMemory(@ShellExecuteInfo, SizeOf(ShellExecuteInfo));
        ShellExecuteInfo.cbSize := SizeOf(TShellExecuteInfo);
        ShellExecuteInfo.Wnd := Handle;
        ShellExecuteInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
      
        if (eoElevate in Options) and (IsUACActive) then
          ShellExecuteInfo.lpVerb := PChar('runas');
      
        ShellExecuteInfo.lpFile := PChar(Filename);
      
        if Paramaters <> '' then
          ShellExecuteInfo.lpParameters := PChar(Paramaters);
      
        // Show or hide the window
        if eoHide in Options then
          ShellExecuteInfo.nShow := SW_HIDE
        else
          ShellExecuteInfo.nShow := SW_SHOWNORMAL;
      
        if ShellExecuteEx(@ShellExecuteInfo) then
          Result := 0;
      
        if (Result = 0) and (eoWait in Options) then
        begin
          GetExitCodeProcess(ShellExecuteInfo.hProcess, ExitCode);
      
          while (ExitCode = STILL_ACTIVE) and
                (not Application.Terminated) do
          begin
            sleep(50);
      
            GetExitCodeProcess(ShellExecuteInfo.hProcess, ExitCode);
          end;
      
          Result := ExitCode;
        end;
      end;
      

      【讨论】:

      • 您好,您确认后 XP 操作系统是否需要管理员权限才能使用命令行参数运行?只是好奇,因为我的用户可能没有登录管理员帐户。
      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 2011-05-05
      • 2012-07-15
      • 2017-07-04
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      相关资源
      最近更新 更多