Биометрическая структура Windows: AcquireFocus() не работает. Ошибка AccessDenied: 0x80070005

Я разрабатываю службу Windows для захвата образца отпечатка пальца. WBF (Windows Bio metric Framework) требует фокусировки для захвата образца изображения, для которого я использую AcquireFocus().

Экспорт из DLL происходит следующим образом.

 class Focus
    {
        protected const string LibName = "winbio.dll";

        [DllImport(LibName, EntryPoint = "WinBioAcquireFocus")]
        public static extern WinBioErrorCode WinBioAcquireFocus();

        [DllImport(LibName, EntryPoint = "WinBioReleaseFocus")]
        public static extern WinBioErrorCode WinBioReleaseFocus();
    }

Использование выглядит следующим образом

WriteToFile(DateTime.Now + " Acquiring Focus" + "\n");
re = Focus.WinBioAcquireFocus();
if (re.Equals(WinBioErrorCode.Ok)){
    WriteToFile(DateTime.Now + " Calling CaptureSample Image." + "\n");
    result = wbf.CaptureSampleImage();
 }
 else{
     WriteToFile(DateTime.Now + " Error in Acquiring Focus: " + re + "\n");
  }

Эта функция требует, чтобы процесс выполнялся под учетной записью LocalSystem, как указано в документации. Я установил это в настройках сервиса.

this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;

CaptureSampleImage() определяется в DLL. Теперь я всегда получаю ошибку 0x80070005, что означает отказ в доступе. Файл журнала выглядит следующим образом.

10/22/2019 4:16:06 PM Acquiring Focus

10/22/2019 4:16:06 PM Error in Acquiring Focus: AccessDenied

10/22/2019 4:16:06 PM Stopping Service.

Коды ошибок определены как Enum следующим образом

    public enum WinBioErrorCode
         : uint
    {
        Ok = 0,
        False = 1,
        AccessDenied = 0x80070005,
        ...
    }

В документации говорится, что это происходит из-за того, что служба не находится в LocalSystem, тогда как это так.

Для ведения журнала я написал writeToFile(сообщение), которое записывает сообщение в файл.txt.

Что я могу сделать, чтобы удалить эту ошибку?

Заранее спасибо.

1 ответ

Решение

Добавьте AcquireFocus() сразу после WinBioOpenSession(). Затем он получит фокус для этого сеанса и вернет S_OK.

Другие вопросы по тегам