Screl.ZKemKeeper 1.1.0

dotnet add package Screl.ZKemKeeper --version 1.1.0
                    
NuGet\Install-Package Screl.ZKemKeeper -Version 1.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Screl.ZKemKeeper" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Screl.ZKemKeeper" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Screl.ZKemKeeper" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Screl.ZKemKeeper --version 1.1.0
                    
#r "nuget: Screl.ZKemKeeper, 1.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Screl.ZKemKeeper@1.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Screl.ZKemKeeper&version=1.1.0
                    
Install as a Cake Addin
#tool nuget:?package=Screl.ZKemKeeper&version=1.1.0
                    
Install as a Cake Tool

Screl.ZKemKeeper

NuGet

.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 Registrationzkemkeeper.dll must 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • 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.

Version Downloads Last Updated
1.1.0 503 5/22/2026
1.0.0 122 5/22/2026