Jak zjistit status Windows service v X++?
Pokud potřebujete zjistit stav jakékoli služby v systému Windows, můžete jako inspiraci použít následující kód:
{
InteropPermission interopPermission = new InteropPermission(InteropKind::DllInterop);
str machineName = "machineName";
str serviceName = "Browser";
DLL dll;
DLLFunction dllFunction;
int hSCM;
Binary binMachineName;
Binary binDBName = new Binary("ServicesActive"); // Opens default database, works also in AX 3.0
DLLFunction openServiceFunction;
DLLFunction queryServiceStatusFunction;
DLLFunction closeServiceHandleFunction;
Binary binServiceName;
int hService;
Binary serviceStatus = new Binary(28);
int status;
str serviceInfoMsg = "Service is %1.";
;
interopPermission.assert();
dll = new DLL("advapi32.dll");
if (dll)
{
dllFunction = new DLLFunction(dll, "OpenSCManagerA");
if (dllFunction)
{
dllFunction.arg(ExtTypes::Pointer, ExtTypes::Pointer, ExtTypes::DWord);
dllFunction.returns(ExtTypes::DWord);
closeServiceHandleFunction = new DLLFunction(dll, "CloseServiceHandle");
if (closeServiceHandleFunction)
{
closeServiceHandleFunction.arg(ExtTypes::DWord);
closeServiceHandleFunction.returns(ExtTypes::DWord);
}
else
{
error("Failed to get 'CloseServiceHandle' function.");
return;
}
binMachineName = new Binary(machineName);
hSCM = dllFunction.call(binMachineName, binDBName, 0x80000000);
if (hSCM)
{
openServiceFunction = new DLLFunction(dll, "OpenServiceA");
if (openServiceFunction)
{
openServiceFunction.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
openServiceFunction.returns(ExtTypes::DWord);
binServiceName = new Binary(serviceName);
hService = openServiceFunction.call(hSCM, binServiceName, 0x80000000);
if (hService)
{
queryServiceStatusFunction = new DLLFunction(dll, "QueryServiceStatus");
if (queryServiceStatusFunction)
{
queryServiceStatusFunction.arg(ExtTypes::DWord, ExtTypes::Pointer);
queryServiceStatusFunction.returns(ExtTypes::DWord);
queryServiceStatusFunction.call(hService, serviceStatus);
status = serviceStatus.dWord(4);
switch(status)
{
case 1:
info(strFmt(serviceInfoMsg, "not running"));
break;
case 2:
info(strFmt(serviceInfoMsg, "starting"));
break;
case 3:
info(strFmt(serviceInfoMsg, "stopping"));
break;
case 4:
info(strFmt(serviceInfoMsg, "running"));
break;
case 5:
info(strFmt(serviceInfoMsg, "continue is pending"));
break;
case 6:
info(strFmt(serviceInfoMsg, "pause is pending"));
break;
case 7:
info(strFmt(serviceInfoMsg, "paused"));
break;
}
}
else
{
error("Failed to get 'QueryServiceStatus' function.");
closeServiceHandleFunction.call(hService);
closeServiceHandleFunction.call(hSCM);
return;
}
closeServiceHandleFunction.call(hService);
}
else
{
error(strFmt("Failed to get service '%1'.", serviceName));
closeServiceHandleFunction.call(hSCM);
return;
}
}
else
{
error("Failed to get 'OpenServiceA' function.");
closeServiceHandleFunction.call(hSCM);
return;
}
closeServiceHandleFunction.call(hSCM);
}
else
{
error("Failed to open service manager.");
return;
}
}
else
{
error("Failed to get 'OpenSCManagerA' function.");
return;
}
}
else
{
error("Failed to load 'advapi32.dll'.");
return;
}
}
Martin F