为什么即使SCardSvr正在运行,SCard EstablishmentContext仍返回SCARD_E_NO_SERVICE?

时间:2019-08-08 18:07:52

标签: windows service smartcard winscard

我正在尝试通过Windows服务(作为“本地系统”运行)在Win10系统上与智能卡进行通信。 调用SCardEstablishContext初始化上下文时,即使智能卡服务“ SCardSvr”显示为由任务管理器运行,返回值也为SCARD_E_NO_SERVICE

如果我尝试在代码中启动“ SCardSvr”,然后调用GetLastError(),则返回1056,它对应于ERROR_SERVICE_ALREADY_RUNNING(“服务实例已在运行。”)

很遗憾,此处https://blogs.msdn.microsoft.com/alejacma/2011/05/19/scardestablishcontext-fails-with-scard_e_no_service-error/列出的解决方法没有任何改变。

这是我正在使用的代码:

// try to establish context
ret = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &mContext);

// check if smartcard service is running
if (ret == SCARD_E_NO_SERVICE)
{
    SC_HANDLE hSCManager = OpenSCManagerA(
        NULL,           // lpMachineName
        NULL,           // lpDatabaseName
        SC_MANAGER_ALL_ACCESS   // dwDesiredAccess
    );
    SC_HANDLE hService = OpenServiceA(
        hSCManager,
        "SCardSvr",     // lpServiceName
        SERVICE_START   // dwDesiredAccess
    );
    BOOL res = StartServiceA(
        hService,
        0,          // dwNumServiceArgs
        NULL        // lpServiceArgVectors
    );
    DWORD errorCode = GetLastError();   // returns 1056
}

如果智能卡服务“ SCardSvr”据说正在运行,我希望SCardEstablishContext返回除SCARD_E_NO_SERVICE之外的其他信息。

0 个答案:

没有答案