Биометрическая структура 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.