Screl.ZKemKeeper
1.1.0
dotnet add package Screl.ZKemKeeper --version 1.1.0
NuGet\Install-Package Screl.ZKemKeeper -Version 1.1.0
<PackageReference Include="Screl.ZKemKeeper" Version="1.1.0" />
<PackageVersion Include="Screl.ZKemKeeper" Version="1.1.0" />
<PackageReference Include="Screl.ZKemKeeper" />
paket add Screl.ZKemKeeper --version 1.1.0
#r "nuget: Screl.ZKemKeeper, 1.1.0"
#:package Screl.ZKemKeeper@1.1.0
#addin nuget:?package=Screl.ZKemKeeper&version=1.1.0
#tool nuget:?package=Screl.ZKemKeeper&version=1.1.0
Screl.ZKemKeeper
.NET 8.0 interop package for ZKTeco / ESSL biometric attendance devices. Bundles the managed COM interop assembly and all native DLLs so you don't need a separate SDK install.
Installation
dotnet add package Screl.ZKemKeeper
Or via the NuGet Package Manager in Visual Studio:
Install-Package Screl.ZKemKeeper
What's Included
| Component | Description |
|---|---|
Interop.zkemkeeper.dll |
Managed COM interop assembly (embedded interop types) |
zkemkeeper.dll |
Core ZKTeco COM SDK |
zkemsdk.dll |
ZKTeco SDK engine |
| 11 communication DLLs | TCP, USB, RS232/485, and Pull SDK transports |
All native DLLs are automatically copied to your output directory via MSBuild targets — no manual setup needed in your project.
Requirements
- Windows (x86 native DLLs, runs on x64 via WoW64)
- .NET 8.0 or later
- COM Registration —
zkemkeeper.dllmust be registered once per machine (see below)
COM Registration
The native zkemkeeper.dll is a COM server and must be registered on each target machine. Run as Administrator:
regsvr32 zkemkeeper.dll
The DLL will be in your build output directory after compilation. This is a one-time setup per machine.
Quick Start
Connect to a Device
using zkemkeeper;
CZKEM zk = new CZKEM();
bool connected = zk.Connect_Net("192.168.1.201", 4370);
if (connected)
{
Console.WriteLine("Connected!");
zk.Disconnect();
}
Get Device Info
string firmware = "", vendor = "", serialNo = "", mac = "", sdk = "";
zk.GetFirmwareVersion(1, ref firmware);
zk.GetVendor(ref vendor);
zk.GetSDKVersion(ref sdk);
zk.GetSerialNumber(1, out serialNo);
zk.GetDeviceMAC(1, ref mac);
Console.WriteLine($"Firmware: {firmware}");
Console.WriteLine($"Vendor: {vendor}");
Console.WriteLine($"Serial: {serialNo}");
Download Attendance Logs
int machineNumber = 1;
if (zk.ReadGeneralLogData(machineNumber))
{
string enrollNumber;
int verifyMode, inOutMode, year, month, day, hour, minute, second, workCode = 0;
while (zk.SSR_GetGeneralLogData(machineNumber,
out enrollNumber, out verifyMode, out inOutMode,
out year, out month, out day, out hour, out minute, out second,
ref workCode))
{
var timestamp = new DateTime(year, month, day, hour, minute, second);
string direction = inOutMode == 0 ? "IN" : "OUT";
Console.WriteLine($"User {enrollNumber} — {direction} at {timestamp}");
}
}
Get All Enrolled Users
int machineNumber = 1;
zk.ReadAllUserID(machineNumber);
string enrollNo, name, password;
int privilege;
bool enabled;
while (zk.SSR_GetAllUserInfo(machineNumber,
out enrollNo, out name, out password, out privilege, out enabled))
{
Console.WriteLine($"ID: {enrollNo}, Name: {name}, Enabled: {enabled}");
}
Enroll / Update a User on Device
bool success = zk.SSR_SetUserInfo(1, "101", "John Doe", "", 0, true);
Delete a User from Device
bool success = zk.DeleteUserInfoEx(1, 101);
Real-Time Events (Live Attendance)
int machineNumber = 1;
if (zk.RegEvent(machineNumber, 65535))
{
zk.OnAttTransactionEx += (enrollNumber, isInValid, attState, verifyMethod,
year, month, day, hour, minute, second, workCode) =>
{
var timestamp = new DateTime(year, month, day, hour, minute, second);
string direction = attState == 0 ? "IN" : "OUT";
Console.WriteLine($"[LIVE] {enrollNumber} punched {direction} at {timestamp}");
};
}
Device Control
int machineNumber = 1;
// Beep the device
zk.Beep(100);
// Open door / relay
zk.ACUnlock(machineNumber, 5000);
// Sync device clock
var now = DateTime.Now;
zk.SetDeviceTime2(machineNumber, now.Year, now.Month, now.Day,
now.Hour, now.Minute, now.Second);
// Restart device
zk.RestartDevice(machineNumber);
// Clear attendance logs from device
zk.ClearGLog(machineNumber);
Common Methods Reference
| Method | Description |
|---|---|
Connect_Net(ip, port) |
Connect to device over TCP |
Disconnect() |
Disconnect from device |
ReadGeneralLogData(machineNo) |
Load attendance log buffer |
SSR_GetGeneralLogData(...) |
Iterate loaded attendance logs |
ReadAllUserID(machineNo) |
Load user buffer |
SSR_GetAllUserInfo(...) |
Iterate loaded users |
SSR_SetUserInfo(...) |
Create or update a user on device |
DeleteUserInfoEx(machineNo, enrollNo) |
Delete a user from device |
RegEvent(machineNo, eventMask) |
Register for real-time events |
OnAttTransactionEx |
Event fired on attendance punch |
GetFirmwareVersion(...) |
Get device firmware version |
GetSerialNumber(...) |
Get device serial number |
GetDeviceMAC(...) |
Get device MAC address |
ACUnlock(machineNo, delayMs) |
Trigger door relay |
Beep(delayMs) |
Beep the device |
SetDeviceTime2(...) |
Set device date/time |
RestartDevice(machineNo) |
Restart the device |
ClearGLog(machineNo) |
Clear attendance logs on device |
GetLastError(ref errCode) |
Get last SDK error code |
Supported Devices
Works with ZKTeco / ESSL biometric devices that use the ZKem SDK, including:
- ZKTeco K-series (K40, K60, K80)
- ZKTeco UA-series (UA100, UA200, UA300, UA400, UA760)
- ZKTeco MB-series (MB160, MB360, MB460)
- ZKTeco uFace series
- ZKTeco SpeedFace series
- ESSL X-series (X990, X7)
- ESSL iFace series
- Other ZKTeco-compatible devices supporting the PULL SDK protocol
Troubleshooting
| Issue | Solution |
|---|---|
COMException: Class not registered |
Run regsvr32 zkemkeeper.dll as Administrator |
Connect_Net returns false |
Verify device IP, port (default 4370), and network connectivity |
BadImageFormatException |
Ensure your app runs as x86 or AnyCPU (prefer 32-bit) |
| Events not firing | Call RegEvent(machineNo, 65535) before subscribing to events |
License
MIT
Author
SCREL INFO PVT LTD
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.