[Code]
// GLOBAL
var
g_bUseMySQL: Boolean;
g_bDBTypeSelected : Boolean;
g_bIsUpgrade : Boolean;
// The NT-service specific parts of the scrit below is taken
// from the innosetup extension knowledgebase.
// Author: Silvio Iaccarino silvio.iaccarino(at)de.adp.com
// Article created: 6 November 2002
// Article updated: 6 November 2002
// http://www13.brinkster.com/vincenzog/isxart.asp?idart=31
type
SERVICE_STATUS = record
dwServiceType : cardinal;
dwCurrentState : cardinal;
dwControlsAccepted : cardinal;
dwWin32ExitCode : cardinal;
dwServiceSpecificExitCode : cardinal;
dwCheckPoint : cardinal;
dwWaitHint : cardinal;
end;
ENUM_SERVICE_STATUS = record
strServiceName:PChar;
strDisplayName:PChar;
Status: SERVICE_STATUS;
end;
HANDLE = cardinal;
const
ENUM_SERVICE_STATUS_SIZE = 36;
const SERVICE_ERROR_NORMAL =1;
const
SERVICE_QUERY_CONFIG = $1;
SERVICE_CHANGE_CONFIG = $2;
SERVICE_QUERY_STATUS = $4;
SERVICE_START = $10;
SERVICE_STOP = $20;
SERVICE_ALL_ACCESS = $f01ff;
SC_MANAGER_ALL_ACCESS = $f003f;
SERVICE_KERNEL_DRIVER =$1;
SERVICE_WIN32_OWN_PROCESS = $10;
SERVICE_WIN32_SHARE_PROCESS = $20;
SERVICE_WIN32 = $30;
SERVICE_INTERACTIVE_PROCESS = $100;
SERVICE_BOOT_START = $0;
SERVICE_SYSTEM_START = $1;
SERVICE_AUTO_START = $2;
SERVICE_DEMAND_START = $3;
SERVICE_DISABLED = $4;
SERVICE_DELETE = $10000;
SERVICE_CONTROL_STOP = $1;
SERVICE_CONTROL_PAUSE = $2;
SERVICE_CONTROL_CONTINUE = $3;
SERVICE_CONTROL_INTERROGATE = $4;
SERVICE_STOPPED = $1;
SERVICE_START_PENDING = $2;
SERVICE_STOP_PENDING = $3;
SERVICE_RUNNING = $4;
SERVICE_CONTINUE_PENDING = $5;
SERVICE_PAUSE_PENDING = $6;
SERVICE_PAUSED = $7;
function ControlService(hService :HANDLE; dwControl :cardinal;var ServiceStatus :SERVICE_STATUS) : boolean;
external 'ControlService@advapi32.dll stdcall';
function CloseServiceHandle(hSCObject :HANDLE): boolean;
external 'CloseServiceHandle@advapi32.dll stdcall';
function DeleteService(hService :HANDLE): boolean;
external 'DeleteService@advapi32.dll stdcall';
function CreateService(hSCManager :HANDLE;lpServiceName, lpDisplayName: string;dwDesiredAccess,dwServiceType,dwStartType,dwErrorControl: cardinal;lpBinaryPathName,lpLoadOrderGroup: String; lpdwTagId : cardinal;lpDependencies,lpServiceStartName,lpPassword :string): cardinal;
external 'CreateServiceA@advapi32.dll stdcall';
function OpenService(hSCManager :HANDLE;lpServiceName: string; dwDesiredAccess :cardinal): HANDLE;
external 'OpenServiceA@advapi32.dll stdcall';
function OpenSCManager(lpMachineName, lpDatabaseName: string; dwDesiredAccess :cardinal): HANDLE;
external 'OpenSCManagerA@advapi32.dll stdcall';
function QueryServiceStatus(hService :HANDLE;var ServiceStatus :SERVICE_STATUS) : boolean;
external 'QueryServiceStatus@advapi32.dll stdcall';
function StartService(hService:HANDLE;nNumOfpara:DWORD;strParam:String):boolean;
external 'StartServiceA@advapi32.dll stdcall';
function EnumDependentServices(hService:HANDLE;dwServiceState:DWORD;var Service_Status : Array of ENUM_SERVICE_STATUS; cbBufSize:DWORD; var pcbByteNeeded, lpServicesReturned:DWORD):boolean;
external 'EnumDependentServicesA@advapi32.dll stdcall';
{
function GetLastError():DWORD;
external 'GetLastError@Kernel32.dll stdcall';
}
function OpenServiceManager() : HANDLE;
begin
if UsingWinNT() = true then begin
Result := OpenSCManager('','ServicesActive',SC_MANAGER_ALL_ACCESS);
if Result = 0 then
MsgBox('the servicemanager is not available', mbError, MB_OK)
end
else begin
MsgBox('only nt based systems support services', mbError, MB_OK)
Result := 0;
end
end;
function IsServiceInstalled(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_CONFIG);
if hService <> 0 then begin
Result := true;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function IsServiceRunning(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_STATUS);
if hService <> 0 then begin
if QueryServiceStatus(hService,Status) then begin
Result :=(Status.dwCurrentState = SERVICE_RUNNING)
end;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function StopService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
i : integer;
begin
hSCM := OpenServiceManager();
Result := false;
OutputString('=============Service Name=====:'+ServiceName+' =============================='+#10+#13);
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_STOP);
if hService <> 0 then begin
Result := ControlService(hService,SERVICE_CONTROL_STOP,Status);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
// 延尽检查3次
for i:=1 to 3 do
begin
if( IsServiceRunning(ServiceName)) then
begin
Sleep(3000);
end
else
begin
exit;
end;
end;
end;
end;
function SartService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_START);
if hService <> 0 then begin
Result := StartService(hService,0,'');
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end;
function RemoveService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_DELETE);
if hService <> 0 then begin
Result := DeleteService(hService);
//CloseServiceHandle(hService)
RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\'+ServiceName);
sleep(100);
RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\'+ServiceName);
end;
CloseServiceHandle(hSCM)
end;
end;
function UninsService(ServiceName:string):boolean;
var
pStatus: array of ENUM_SERVICE_STATUS;
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
cbSizeNeed,cbSizeReturned:cardinal;
nServiceNum:integer;
i:integer;
begin
cbSizeReturned:=0;
nServiceNum:=0;
while( IsServiceRunning(ServiceName) ) do
begin
StopService(ServiceName);
end;
result:= RemoveService(ServiceName);
end;
function SGEnumService(strServicName:string):boolean;
var
pStatus: array of ENUM_SERVICE_STATUS;
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
cbSizeNeed,cbSizeReturned:DWORD;
nServiceNum:integer;
i:integer;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,strServicName,SERVICE_ALL_ACCESS);
if hService <> 0 then begin
SetArrayLength(pStatus,5);
if EnumDependentServices(hService,$1,pStatus,ENUM_SERVICE_STATUS_SIZE,cbSizeNeed,cbSizeReturned) then begin
nServiceNum:= cbSizeReturned/ENUM_SERVICE_STATUS_SIZE;
for i:=0 to (nServiceNum-1) do
begin
MsgBox(pStatus.strServiceName,mbInformation,MB_OK);
//StopService(pStatus.strServiceName);
end;
end ;
MsgBox(IntToStr(cbSizeNeed),mbInformation,MB_OK);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end;
function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal;szDepends:string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := CreateService(hSCM,ServiceName,DisplayName,SERVICE_ALL_ACCESS,ServiceType,StartType,SERVICE_ERROR_NORMAL,FileName,'',0,szDepends,'','');
if hService <> 0 then begin
Result := true;
// Win2K & WinXP supports aditional description text for services
if Description<> '' then
RegWriteStringValue(HKLM,'System\CurrentControlSet\Services\' + ServiceName,'Description',Description);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
显示总是不太对,上传一个iss
poplarshine 2009-05-06 14:22
谢谢,收下研究一下。
poplarshine 2009-05-06 14:51
奇怪,我试了第一次成功,但以后试的就不行了,有没有简单的方法,如运行命令:net stop
wanfu 2009-05-06 15:28
这么麻烦啊,不如写个VBS脚本,调用一下!
'此脚本可以在telnet服务已经禁用且关闭的情况下开启Schedule服务,^-^
'Option explicit
On Error Resume Next
dim objwmiservice,colservices
dim objservice,servername
dim strComputer
servername = "Schedule"
strComputer = "."
'set objwmiservice = getobject("winmgmts:\\.")
'也可以采用下列语句(增加空间)
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
'set colservices = objwmiservice.instancesof("win32_service")
'也可以采用下列语句
Set colservices = objWMIService.ExecQuery _
("Select * from Win32_Service) where Name='" & ServiceName & "'")
Dim result
result = MsgBox("[是]开启 Schedule 服务" & vbCr & "[否]关闭 Schedule 服务" & vbCr &"[取消]退出脚本",3+64,"Schedule Service")
If result=6 then
for each objservice in colservices
'如果前面的set colservices = objwmiservice.instancesof("win32_service")的话,下面的if语句必须
'if objservice.name = servername then
objservice.changestartmode("Automatic") 'Manual,Automatic,Disabled,更改服务的启动模式。
'或者下列语句(返回错误码)
errReturnCode = objservice.changestartmode("Automatic")
'errReturnCode = objService.Change( , , , , "Automatic") 或
objservice.startservice() 'StartService 方法会尝试将服务放置到其启动状态中。
'或者下列语句(返回错误码)
'errReturn = objService.StartService()
'end if
Next
ElseIf result = 7 then
for each objservice in colservices
if objservice.name = servername Then
objservice.stopservice() 'StopService 方法会将该服务放置到其终止状态中。
end if
Next
End if
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END

















![[PDF文件格式参考]PDF Reference 1.7-JoyCode 斑马快跑](https://qiniu.joycode.com.cn/2020/10/20201011222013698208.jpeg)

















