gpt4 book ai didi

delphi - 在Delphi中如何以管理员权限运行命令?

转载 作者:行者123 更新时间:2023-12-02 03:52:15 27 4
gpt4 key购买 nike

我正在尝试在 Win 7 上从 Delphi XE2 停止 mysql。我已经根据在网上找到的 Delphi 7 的一些代码编写了一些代码,这应该可以做到这一点,但它不起作用:

function StopMySQL: boolean;
const
UserName = 'Mark';
Domain = 'PC-Mark';
Command = 'net stop mysql';
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
result := CreateProcessWithLogonW(Username, Domain, Password, 0, nil, Command, 0, nil, nil, StartupInfo, ProcessInfo);
if result then
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
end;

有人知道怎么做吗?

TIA马克·帕特森

最佳答案

自 Vista 起,您将需要更高的访问权限才能启动/停止服务。
一种简单的方法是将 RunAs 与 Shellexecute(Ex) 结合使用。

ShellExecute(handle,'RunAs','net','stop mysql',nil,sw_Show);

更好的方法是使用 list ,它可能如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

一个最小的解决方案,不需要“网络”,可能看起来像这样,应该有更多的工作,例如。测试服务是否正在运行,但这取决于您,可以使用 WinSvc 来完成:

implementation
uses WinSvc;
{$R *.dfm}
{$R administrator.res}

function ServiceStop(Machine, ServiceName: string): Boolean;

var
ServiceControlManager, ServiceHandle: SC_Handle;
ServiceStatus: TServiceStatus;
dwCheckPoint: DWORD;
begin
ServiceControlManager := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);
if ServiceControlManager > 0 then
begin
ServiceHandle := OpenService(ServiceControlManager, PChar(ServiceName),
SERVICE_STOP or SERVICE_QUERY_STATUS);
if ServiceHandle > 0 then
begin
if (ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus)) then
begin
if (QueryServiceStatus(ServiceHandle, ServiceStatus)) then
begin
while (SERVICE_STOPPED <> ServiceStatus.dwCurrentState) do
begin
dwCheckPoint := ServiceStatus.dwCheckPoint;
Sleep(ServiceStatus.dwWaitHint);
if (not QueryServiceStatus(ServiceHandle, ServiceStatus)) then
break;
if (ServiceStatus.dwCheckPoint < dwCheckPoint) then
break;
end;
end;
end;
CloseServiceHandle(ServiceHandle);
end;
CloseServiceHandle(ServiceControlManager);
end;

Result := (SERVICE_STOPPED = ServiceStatus.dwCurrentState);
end;

procedure TForm2.Button1Click(Sender: TObject);

begin
If ServiceStop('','mysql') then Showmessage('Service Stopped')
else Showmessage('Nope');
end;

可以通过以下方式创建管理员资源

  • 将上面的显示 X​​ML 代码保存为administrator.manifest
  • 使用内容创建文件administrator.rc

1 24 "administrator.manifest"

  • 正在运行

brcc32 administrator.rc

使用创建的administrator.res将需要:

  1. 在较新的 delphi 版本上禁用运行时主题,这些主题包含在 list 中
  2. 从现有项目中删除 XPMan(组件和代码,包含在 list 中)
  3. 如果您需要调试应用程序,delphi 也必须以管理员身份启动。

Source and anything needed for the manifest can be downloaded here

关于delphi - 在Delphi中如何以管理员权限运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15492649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com