การติดตั้ง / ถอนการติดตั้งบริการ Windows ใน Windows 10

ฉันมีแอปพลิเคชันใน C++ ซึ่งพยายามเรียกใช้ (ในขณะนั้น คิดว่าไม่มีกระบวนการอื่นที่เกี่ยวข้องกำลังทำงานอยู่) เพื่อติดตั้งบริการสองสามอย่าง

ขั้นตอนการทำงานคือ หากมีบริการอยู่ ระบบจะถอนการติดตั้งบริการดังกล่าว มิฉะนั้นจะถอนการติดตั้งแล้วติดตั้งใหม่

ฉันได้ปฏิบัติตามบทช่วยสอนบางอย่างเช่น: การติดตั้งบริการ< /ก>

ขออภัย ดูเหมือนมีบางอย่างผิดปกติกับการติดตั้งหรือการถอนการติดตั้ง

เมื่อสมมติว่าไม่ได้ติดตั้งบริการ เมื่อฉันดำเนินการติดตั้งบริการ บริการเหล่านั้นจะได้รับการติดตั้ง และจากนั้นฉันก็พยายามเปลี่ยนการกำหนดค่าเป็นดีเลย์ - สตาร์ทอัตโนมัติ

ในขั้นตอนนี้ แม้ว่าจะมีการติดตั้งบริการแล้ว แต่ฉันไม่สามารถเริ่มบริการได้ เนื่องจากฉันได้รับข้อผิดพลาดแจ้งว่าไม่พบบริการ

เมื่อฉันลองถอนการติดตั้งบริการ การถอนการติดตั้งล้มเหลว โดยให้ข้อผิดพลาด 1,060 โดยแจ้งว่าบริการถูกทำเครื่องหมายเพื่อการลบ

SC_HANDLE schSCManager;
SC_HANDLE schService;

schSCManager = OpenSCManager(
    NULL,                    // local computer
    NULL,                    // ServicesActive database 
    SC_MANAGER_ALL_ACCESS);  // full access rights 

if (schSCManager == nullptr)
{
    continue;
}
if (bInstall)
{
    schService = CreateService(
        schSCManager,              // SCM database 
        szServiceName,                   // name of service 
        szDisplayName,                   // service name to display 
        SERVICE_ALL_ACCESS,        // desired access 
        SERVICE_WIN32_OWN_PROCESS, // service type 
        SERVICE_DEMAND_START,      // start type 
        SERVICE_ERROR_NORMAL,      // error control type 
        szDirectory,                    // path to service's binary 
        NULL,                      // no load ordering group 
        NULL,                      // no tag identifier 
        NULL,                      // no dependencies 
        NULL,                      // LocalSystem account 
        NULL);                     // no password 

    if (schService == NULL)
    {
        TraceAdvice(L"CreateService failed (%d)\n", GetLastError());

        CloseServiceHandle(schSCManager);
        continue;
    }
    else
    {
        if (!ChangeServiceConfig(
            schService,            // handle of service 
            SERVICE_NO_CHANGE,     // service type: no change 
            SERVICE_CONFIG_DELAYED_AUTO_START_INFO,  // service start type 
            SERVICE_NO_CHANGE,     // error control: no change 
            NULL,                  // binary path: no change 
            NULL,                  // load order group: no change 
            NULL,                  // tag ID: no change 
            NULL,                  // dependencies: no change 
            NULL,                  // account name: no change 
            NULL,                  // password: no change 
            NULL))                // display name: no change
        {
            TraceAdvice(L"ChangeServiceConfig failed (%d)\n", GetLastError());
        }
        TraceAdvice(L"Service installed successfully\n");
    }

    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
    /*TraceFatal(_T("Now installing : %s"), szServiceName);
    _stprintf_s(szTmp, _T("SC create %s binpath= \"%s%s.exe\" displayName= \"%s\"  start= delayed-auto"), szServiceName, szDirectory, szServiceName, szDisplayName);
    TraceFatal(_T("Command is : %s"), szTmp);*/
}
else
{

    _wsystem(_T("taskkill /F /IM mmc.exe")); // Need to kill any instance of MMC running
    _wsystem(_T("taskkill /F /IM procexp.exe")); 

    schService = OpenService(
        schSCManager,       // SCM database 
        szServiceName,          // name of service 
        DELETE);            // need delete access 

    if (schService == NULL)
    {
        TraceAdvice(L"OpenService failed (%d)\n", GetLastError());
        CloseServiceHandle(schSCManager);
        continue;
    }

    DWORD dwBytesNeeded;
    SERVICE_STATUS_PROCESS ssp;

    if (!QueryServiceStatusEx(
        schService,
        SC_STATUS_PROCESS_INFO,
        (LPBYTE)&ssp,
        sizeof(SERVICE_STATUS_PROCESS),
        &dwBytesNeeded))
    {
        printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
    }
    if (ssp.dwCurrentState == SERVICE_RUNNING)
    {
        _stprintf_s(szTmp, _T("taskkill /F /IM %s.exe"), szServiceName);
        _wsystem(szTmp);
    }
    // Delete the service.

    if (!DeleteService(schService))
    {
        TraceAdvice(L"DeleteService failed (%d)\n", GetLastError());
    }
    else TraceAdvice(L"Service deleted successfully\n");

    CloseServiceHandle(schService);
    CloseServiceHandle(schSCManager);
}

}

ฉันมั่นใจในทุกประเด็น กล่าวคือ

  • ตัวจัดการงานถูกปิด
  • คอนโซลบริการถูกปิด
  • ปิดอินสแตนซ์ทั้งหมดของ MMC แล้ว
  • บริการถูกหยุด
  • บริการไม่ได้เปิดในตัวดีบักเกอร์ใน Visual Studio...

แต่มันไม่เกิดประโยชน์ บริการไม่ได้รับการถอนการติดตั้งจนกว่าฉันจะรีบูทระบบ (การลบรีจิสทรีที่เชื่อมโยงกับบริการก็ไม่ทำงานเช่นกัน)

ฉันได้ตรวจสอบพารามิเตอร์ที่ฉันส่งต่อไปยังฟังก์ชันเหล่านี้แล้ว และดูเหมือนว่าจะถูกต้อง

ฉันควรตรวจสอบอะไรอีกบ้างเพื่อให้แน่ใจว่าการติดตั้งถูกต้อง หรือการถอนการติดตั้งสำเร็จ


person user1173240    schedule 11.10.2016    source แหล่งที่มา
comment
อะไรทำให้คุณคิดว่าคุณจำเป็นต้องปิดอินสแตนซ์ mmc นั่นเป็นสิ่งที่น่ากลัวมากที่ทำกับผู้ใช้ปลายทาง!   -  person Harry Johnston    schedule 12.10.2016
comment
ข้อมูลเพิ่มเติมกรุณา คุณพยายามเริ่มบริการอย่างไร และข้อความแสดงข้อผิดพลาดแน่นอนคืออะไร คุณแน่ใจหรือไม่ว่า szDirectory มีเส้นทาง เต็ม ไปยังบริการที่ปฏิบัติการได้ และไม่ใช่ (ตามชื่อตัวแปรที่แนะนำ) เป็นเพียงเส้นทางไปยังไดเรกทอรีที่บริการปฏิบัติการอยู่ เมื่อถอนการติดตั้ง ผลลัพธ์ของการเรียก QueryServiceStatusEx คืออะไร   -  person Harry Johnston    schedule 12.10.2016
comment
นอกจากนี้ TraceAdvice() ทำหน้าที่อะไร   -  person Harry Johnston    schedule 12.10.2016


คำตอบ (1)


คุณต้องหยุดบริการก่อน ไม่เช่นนั้นบริการจะติดอยู่ในสถานะการลบที่รอดำเนินการ การบังคับให้ฆ่าบริการนั้นไม่เหมือนกับการหยุดบริการ จากส่วนเดียวกันของเอกสารประกอบ คุณ ต้อง ControlService(SERVICE_CONTROL_STOP)

person Luke    schedule 11.10.2016