当前位置:亚洲城ca88 > ca88手机版登录 > Windows中完成不依附于账户登入的开机运行程序,

Windows中完成不依附于账户登入的开机运行程序,

文章作者:ca88手机版登录 上传时间:2019-11-07

Windows中完毕不依据账户登入的开机运维程序,不依附账

在Windows四川中国广播公司大的天职,大家盼望可以在Windows 运转未来自动运营。比如,公司有个订饭系统,基本天天都亟需登入去订饭,于是写一个剧本完毕活动订饭。但是您的Computer每日要关机,当然不指望开机后还要求手动运转这些订饭脚本了。于是那个时候大家要将其这种本子完毕为开机自动运行脚本。
但要注意本文要讲的开机运维的次序,是在客商还还未有登入的情况下促成运维的。换句话说,本文描述的开机运行的程序运维在Session 0中 主要介绍了3中方法, 我们能够接收适当的秘籍去贯彻。

前言:

由此钻研Windows服务注册卸载的原理,感觉它并从未怎么特别复杂的事物,Windows服务正在一步步退去它那神秘的面纱,至于是否美丽的女人,大家可要睁大眼睛看明白了。

Windows Service

当Windows 运维的时候,还并未有登陆账号的时候,这时候Windows中装置为auto状态的Service将会在Session 0中运营。能够依照如下步骤去贯彻Windows Service:

  1. 如果还未贯彻过Windows Service 程序的同学,能够参见那篇小说《Simple Windows Service in C 》去落到实处。
  2. 因此命令行创立Service, 主要注意start= auto设置Service为开机运营。

    sc create “SERVICE_NAME” binpath= "SERVICE_PROGRAM" displayname= "SERVICE_DESCRIPTION" start= auto

办事中恐怕会高出以下情况,利用windows作为中间转播,来兑现两台linux服务器的文件传输。

接下去钻探一下Windows服务的起步和截至的流水生产线。

Windows Startup Script

依据如下步骤:

  1. 展开本地的组攻略管理,运维命令gpedit
    2. 然后依次张开Computer Configuration->Windows Settings->Scripts-> Startup, 在Startup中配置要求开机运维的脚本可能程序。
    在机械中的配置,大家都尽量的期待自动化,于是希望通过脚本来完毕那一个动作。缺憾没有CMD 命令能够直接选用这种办法增多运行程序,后来博主搜索了有的措施,有通过直接订正注册表的、也可以有经过vb脚本去落到实处的,但这几个方法个人认为还相当不足直接,简单。
    于是博主找到了接下去要说的办法,通过Windows准时职务微处理器。

贯彻步骤:

启航流程

运营时自然是从程序的入口点在此以前

extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, 
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
    //这里是程序的入口点,直接调用了ATL框架中的CServiceModuleT类的WinMain方法
    return _AtlModule.WinMain(nShowCmd);
}

接下去进入_AtlModule.WinMain查看细节。

//处理命令行参数后,开始启动
if (pT->ParseCommandLine(lpCmdLine, &hr) == true)
    hr = pT->Start(nShowCmd);

WinMain方法中,主尽管对命令行参数进行拍卖后,调用Start方法开展运转。

HRESULT Start(_In_ int nShowCmd) throw()
{
    T* pT = static_cast<T*>(this);
    // Are we Service or Local Server
    CRegKey keyAppID;
    LONG lRes = keyAppID.Open(HKEY_CLASSES_ROOT, _T("AppID"), KEY_READ);
    if (lRes != ERROR_SUCCESS)
    {
        m_status.dwWin32ExitCode = lRes;
        return m_status.dwWin32ExitCode;
    }

    CRegKey key;
    lRes = key.Open(keyAppID, pT->GetAppIdT(), KEY_READ);
    if (lRes != ERROR_SUCCESS)
    {
        m_status.dwWin32ExitCode = lRes;
        return m_status.dwWin32ExitCode;
    }

    TCHAR szValue[MAX_PATH];
    DWORD dwLen = MAX_PATH;
    //读取注册表信息
    //通过regserver方式注册服务,则lRes为ERROR_SUCCESS
    //通过service方式注册服务,   则lRes不等于ERROR_SUCCESS
    lRes = key.QueryStringValue(_T("LocalService"), szValue, &dwLen);

    m_bService = FALSE;
    if (lRes == ERROR_SUCCESS)
        m_bService = TRUE;

    if (m_bService)
    {
        //以Windows服务的方式运行
        SERVICE_TABLE_ENTRY st[] =
        {
            { m_szServiceName, _ServiceMain },
            { NULL, NULL }
        };
        if (::StartServiceCtrlDispatcher(st) == 0)
            m_status.dwWin32ExitCode = GetLastError();
        return m_status.dwWin32ExitCode;
    }
    // local server - call Run() directly, rather than
    // from ServiceMain()        
    //以普通应用程序的方式运行
    m_status.dwWin32ExitCode = pT->Run(nShowCmd);
    return m_status.dwWin32ExitCode;
}

Start方法中会依照读取到的注册表新闻,来支配是还是不是以服务的方法运营。借使是通过RegServer格局注册服务,则以常备程序运营;假若是经过Service情势注册服务,则以Windows服务的点子运转。

日常程序方法运转,不在本文的座谈范围之内,上边来看一下以Windows服务方法运转的长河。

以Windows服务方法运营以来,程序会调用StartServiceCtrlDispatcher方法,看一下有关此办法的MSDN的解说

Connects the main thread of a service process to the service control manager, which causes the thread to be the service control dispatcher thread for the calling process.


Remarks
When the service control manager starts a service process, it waits for the process to call the StartServiceCtrlDispatcher function. The main thread of a service process should make this call as soon as possible after it starts up (within 30 seconds). If StartServiceCtrlDispatcher succeeds, it connects the calling thread to the service control manager and does not return until all running services in the process have entered the SERVICE_STOPPED state. The service control manager uses this connection to send control and service start requests to the main thread of the service process. The main thread acts as a dispatcher by invoking the appropriate HandlerEx function to handle control requests, or by creating a new thread to execute the appropriate ServiceMain function when a new service is started.

这段话的忽略是 “调用此措施能够与劳动微处理机创建连接,那样服务微型机就足以管理服务的景观”,实际是服务微型机发出指令后,服务能够对接到到的下令进行响应。

“当服务微型机运行叁个劳务进程,服务微电脑会等待服务进程调用StartServiceCtrlDispatcher方法。服务进程的主线程必得确认保证此办法在30秒内被尽早的施行。若是StartServiceCtrlDispatcher方法成功与劳动微型机创设连接,那么它会等到服务的动静形成SE凯雷德VICE_STOPPED后才回到”。

测算,当Start方法调用StartServiceCtrlDispatcher后,会进去到_ServiceMain方法。

void ServiceMain(
        _In_ DWORD dwArgc,
        _In_reads_(dwArgc) _Deref_pre_z_ LPTSTR* lpszArgv) throw()
{
    lpszArgv;
    dwArgc;
    // Register the control request handler
    m_status.dwCurrentState = SERVICE_START_PENDING;
    m_dwThreadID = GetCurrentThreadId();
    //注册命令处理程序,用于响应服务管理器的控制命令
    RegisterServiceCtrlHandler(m_szServiceName, _Handler);

    //设置服务的状态为已启动
    SetServiceStatus(SERVICE_START_PENDING);

    m_status.dwWin32ExitCode = S_OK;
    m_status.dwCheckPoint = 0;
    m_status.dwWaitHint = 0;

    T* pT = static_cast<T*>(this);

    // When the Run function returns, the service has stopped.
    m_status.dwWin32ExitCode = pT->Run(SW_HIDE);
    //当Run方法结束后,会设置方法的状态为已停止
    SetServiceStatus(SERVICE_STOPPED);
}

_ServiceMain方法中关键是挂号了四个劳务调控命令的管理程序,然后设置服务的情况为已运维,然后调用Run方法。

HRESULT Run(_In_ int nShowCmd = SW_HIDE) throw()
{
    HRESULT hr = S_OK;
    T* pT = static_cast<T*>(this);
    //初始化Com相关的东西
    hr = pT->PreMessageLoop(nShowCmd);

    if (hr == S_OK)
    {
        //处理Msg消息
        pT->RunMessageLoop();
    }

    if (SUCCEEDED(hr))
    {
        //释放Com相关资源
        hr = pT->PostMessageLoop();
    }

    return hr;
}

Run方法中至关心器重倘若循环管理Msg新闻,防止主线程退出。

于今,服务到底完全运维了。

前方看见_ServiceMain方法中注册了三个服务调控命令管理程序,接下去看一下以此措施做了怎么样。

void Handler(_In_ DWORD dwOpcode) throw()
{
    T* pT = static_cast<T*>(this);

    switch (dwOpcode)
    {
        //停止命令
    case SERVICE_CONTROL_STOP:
        pT->OnStop();
        break;
        //暂停命令
    case SERVICE_CONTROL_PAUSE:
        pT->OnPause();
        break;
        //恢复命令
    case SERVICE_CONTROL_CONTINUE:
        pT->OnContinue();
        break;
    case SERVICE_CONTROL_INTERROGATE:
        pT->OnInterrogate();
        break;
    case SERVICE_CONTROL_SHUTDOWN:
        pT->OnShutdown();
        break;
    default:
        pT->OnUnknownRequest(dwOpcode);
    }
}

能够见到,那些法子根据差异的主宰命令,做了区别的拍卖。

 

Windows Schedule Task

Windows依期职分微机,提供了强硬的意义:能够依期的奉行职分,除了遵照时间去触发定期任务,其还提供了开机运行触及程序运转的成效,你能够经过图形分界面包车型地铁艺术安排,也得以透过命令方式:

  • 依次张开Control Panel->Administrative Tools->Task Scheduler,然后再里面新建本身的职分。首要注意以下两点:
    • 职分运营的账号选成”System”
    • 触发器中,选用At Startup触发器
  • 利用如下命令行:
schtasks /create /TN "TASK_NAME" /RU SYSTEM /SC ONSTART /TR "TASK_PROGRAM"

1、FTP上传和下载的bat脚本。

Windows服务的启航流程总括

图片 1

 

本子分为两片段:可实行bat脚本和ftp命令文件;

停止流程

地方大家看看当服务选取到停止服务的命令后,Hanlder方法会通过调用pT->OnStop方法来开展管理。

void OnStop() throw()
{
    SetServiceStatus(SERVICE_STOP_PENDING);
    ::PostThreadMessage(m_dwThreadID, WM_QUIT, 0, 0);
}

OnStop方法中,通过SetServiceStatus方法来设置服务场合为正值结束。并透过PostThreadMessage产生一个WM_QUIT的消息。

void RunMessageLoop() throw()
{
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

这时RunMessageLoop中的While循环中断。

While循环中断后会通过SetServiceStatus设置服务场合为已截至。

然后WinMain方法施行实现,服务实行分离。

那就是漫天的劳动截止流程。

 

可执行bat脚本:

Windows服务的终止流程计算

图片 2

 

@echo off
ftp -s:D:ftpftp.txt

给劳务丰硕本身的启航和小憩时的拍卖

既然已经对Windows服务的开发银行和终止的流水生产线有了三个光景的刺探,那么给劳务丰硕本人的起步和甘休时的拍卖也就相对轻便了有的。

上面是自己的落实代码

class CServicesModule : public ATL::CAtlServiceModuleT< CServicesModule, IDS_SERVICENAME >
{
public :
    DECLARE_LIBID(LIBID_ServicesLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_SERVICES, "{0794CF96-5CC5-432E-8C1D-52B980ACBE0F}")
        HRESULT InitializeSecurity() throw()
    {
        // TODO : 调用 CoInitializeSecurity 并为服务提供适当的安全设置
        // 建议 - PKT 级别的身份验证、
        // RPC_C_IMP_LEVEL_IDENTIFY 的模拟级别
        // 以及适当的非 NULL 安全描述符。

        return S_OK;
    }
    //服务启动
    HRESULT Load();
    //服务停止
    HRESULT UnLoad();

    HRESULT Run(_In_ int nShowCmd = SW_HIDE) throw()
    {
        HRESULT hr = S_OK;
        OutputDebugString(_T("准备启动服务"));
        hr = Load();
        if(hr)
        {
            OutputDebugString(_T("启动服务失败"));
            return hr;
        }
        OutputDebugString(_T("Services服务已启动"));

        hr = ATL::CAtlServiceModuleT< CServicesModule, IDS_SERVICENAME >::Run(nShowCmd);

        hr = UnLoad();
        OutputDebugString(_T("Services服务正常退出"));
        return hr;
    }
};

CServicesModule _AtlModule;

//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, 
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
    return _AtlModule.WinMain(nShowCmd);
}


HRESULT CServicesModule::Load()
{
    OutputDebugString(_T("服务正在启动"));
    return 0;
}

HRESULT CServicesModule::UnLoad()
{
    OutputDebugString(_T("服务正在停止"));
    return 0;
}

 

ftp命令ftp.txt:

举不胜举链接

玩转Windows服务种类——创制Windows服务

玩转Windows服务多元——Debug、Release版本的挂号和卸载,及其规律

玩转Windows服务种类——无COM接口Windows服务运行失败原因及缓慢解决方案

玩转Windows服务体系——服务运营、结束流程浅析

玩转Windows服务体系——Windows服务小技能

玩转Windows服务多元——命令行管理Windows服务

玩转Windows服务种类——Windows服务运维超时时间

玩转Windows服务多元——使用Boost.Application快速创设Windows服务

玩转Windows服务连串——给Windows服务增添COM接口

open 192.168.1.166
ftp-user
passwd
prompt off
lcd D:ftp
cd /home/myftp
mget *
close
open 10.10.12.12
ftp-user<br>passwd
lcd D:ftp
cd /home/myftp
mput *
prompt on
bye
quit

 2、参预Windows准期职分(网摘卡塔 尔(英语:State of Qatar):

【定期职责|开机运行】Windows Server 二〇一〇/2012布署义务安排(职务安插程序卡塔 尔(阿拉伯语:قطر‎每分钟实践BAT

开采陈设任务火速方式(在 “管理工科具”内卡塔 尔(阿拉伯语:قطر‎:

C:ProgramDataMicrosoftWindowsStart MenuProgramsAdministrative ToolsTask Scheduler.lnk

成都百货上千人在问笔者:

1、Windows Server 二〇一〇 安插职务在什么地方配置?

2、Windows Server 二零零六 能够布署每秒钟或是每小时实行笔者的天职吗?

答案是:可以!

首先Windows Server 二零一零不相同于其余服务器操作系统和Windows Server 二〇〇二有着十分大的差距,陈设职务的名称是“职分安排程序”不在调控面板里,而是在“管理工科具”里。由于服务器需求做些任务,定时实行,本人写程序吗,麻烦,所以利用BAT进行代替操作,网络上很两人都说每分钟实行怎么布署,明天我们就安插一下。

1、张开“职责陈设程序”–> 点击“职责安顿程序库”在右则会看出操作项里有“创立基本任务”和“创设职分”如图所示:

图片 3

2、点击“创设职责”后如图所示:填写好相应的名号和勾选好供给的基准

图片 4

3、选取“触发器”选项,点击“新建”,创造职责试行时间,“重复职分间隔”这一个选项后,后边临时间采用,是每时辰,依然每分,可自身选拔后再改善时间,再明确。

图片 5

特意说明:笔者少了一些上当了,认为Windows布署职责是正确不到分钟级别的,首借使观察“重复时间隔离(P)”左边未有“1分钟”选项,如下图所示:

图片 6

实际,它除了下拉采撷外,还可手动校订时间值,举个例子上边包车型客车“1分钟”!!!

4、再来配置需求实施的“操作”,正是接受所写的次第或是BAT文件,这里很首要的布署是筛选BAT文件后,在“开首于(可选卡塔尔国”这里必要求填写相应实施顺序或是BAT文件的四面八方目录,要不然是实施不成事的。

图片 7

5、增加后,列表栏中会现身增加的安排义务。

图片 8

【如何开机运转?】

假诺想开机运转.bat文件,只要在“新建触发器”时,“开始职责”下列框选用“运转时”就可以!

图片 9

【怎么着试行PHP脚本?】

参谋如下图所示:

图片 10

以上正是本文的全体内容,希望对大家的求学抱有助于,也盼望大家多多支持脚本之家。

您只怕感兴趣的稿子:

  • Windows下将Python文件打包成.EXE可施行文件的措施
  • 用node-webkit把web应用打包成桌面应用(windows遭遇)
  • Windows下用py2exe将Python程序打包成exe程序的学科
  • Windows下简单的Mysql备份BAT脚本分享
  • Windows下通过bat获取互联网连线实际名称,抓实IP类设置脚本的宽容性
  • Windows命令行bat批管理延迟sleep方法(批管理延时)
  • windows7系统除去火速格局小箭头BAT脚本分享
  • PHP运营windows应用程序、履行bat批管理、执行cmd命令的艺术(exec、system函数详整)
  • Windows运营bat批管理文件时隐讳cmd命令提示符窗口的方法
  • Windows设置开机自运营bat脚本
  • 黄金年代键删除windows暗中认可分享和取缔空连接的bat代码
  • Windows程序打包脚本[bat]的详尽流程

本文由亚洲城ca88发布于ca88手机版登录,转载请注明出处:Windows中完成不依附于账户登入的开机运行程序,

关键词: 亚洲城ca88