Sample code for 30+ languages & platforms
SQL Server

Windows Credentials Manager / Apple Keychain - List All Secrets

See more Secrets Examples

On Windows, lists all secrets in the Windows Credentials Manager.

On MacOS or iOS, lists all secrets in the Apple Keychain.

Note: This example requires Chilkat v10.1.0 or later.

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

    -- This example requires the Chilkat API to have been previously unlocked.
    -- See Global Unlock Sample for sample code.

    DECLARE @secrets int
    EXEC @hr = sp_OACreate 'Chilkat.Secrets', @secrets OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    -- On Windows, this is the Windows Credentials Manager
    -- On MacOS/iOS, it is the Apple Keychain
    EXEC sp_OASetProperty @secrets, 'Location', 'local_manager'

    -- Pass an empty JSON object to list all secrets.
    DECLARE @json int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT

    DECLARE @results int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @results OUT

    EXEC sp_OASetProperty @results, 'EmitCompact', 0

    EXEC sp_OAMethod @secrets, 'ListSecrets', @success OUT, @json, @results
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @secrets, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @secrets
        EXEC @hr = sp_OADestroy @json
        EXEC @hr = sp_OADestroy @results
        RETURN
      END

    EXEC sp_OAMethod @results, 'Emit', @sTmp0 OUT
    PRINT @sTmp0

    -- Sample output on Windows (listing all secrets contained in the Windows Credentials Manager)
    -- The "targetName" is purely informational and indicates the raw TargetName of the secret (i.e. Credential) stored in the Credentials Manager.
    -- Code for parsing (iterating) the JSON results is shown below..

    -- {
    --   "secrets": [
    --     {
    --       "appName": "Test",
    --       "service": "MyService",
    --       "domain": "Xyz",
    --       "username": "MySecret",
    --       "targetName": "Test/MyService/Xyz/MySecret"
    --     },
    --     {
    --       "appName": "Chilkat",
    --       "service": "TestSplit",
    --       "domain": "local",
    --       "username": "Matt",
    --       "targetName": "Chilkat/TestSplit/local/Matt"
    --     },
    --     {
    --       "appName": "Test2",
    --       "service": "Custom",
    --       "domain": "Ocean",
    --       "username": "Starfish20",
    --       "targetName": "Test2/Custom/Ocean/Starfish20"
    --     },
    --     {
    --       "service": "VS Code Azure",
    --       "domain": "",
    --       "username": "Azure",
    --       "targetName": "VS Code Azure/Azure"
    --     },
    --     {
    --       "appName": "Test2",
    --       "service": "Custom",
    --       "domain": "Ocean",
    --       "username": "Starfish",
    --       "targetName": "Test2/Custom/Ocean/Starfish"
    --     },
    --     {
    --       "appName": "AA_MyApp",
    --       "service": "OAuth2",
    --       "domain": "onedrive",
    --       "username": "matt",
    --       "targetName": "AA_MyApp/OAuth2/onedrive/matt"
    --     }
    --   ]
    -- }

    -- ---------------------------------------------------------------------------------------
    -- Here's sample output for listing secrets on MacOS
    -- Some are secrets created using Chilkat's API, others are pre-existing secrets.
    -- The "keyChainService" and "keyChainAccount" members are purely informational and show the raw Apple Keychain Service and Account information for the secret.

    -- {
    --   "secrets": [
    --     {
    --       "service": "com.apple.scopedbookmarksagent.xpc",
    --       "username": "com.apple.scopedbookmarksagent.xpc",
    --       "keyChainService": "com.apple.scopedbookmarksagent.xpc",
    --       "keyChainAccount": "com.apple.scopedbookmarksagent.xpc"
    --     },
    --     {
    --       "service": "StandaloneBeacon",
    --       "username": "searchparty",
    --       "keyChainService": "StandaloneBeacon",
    --       "keyChainAccount": "searchparty"
    --     },
    --     {
    --       "service": "BeaconStore",
    --       "username": "BeaconStoreKey",
    --       "keyChainService": "BeaconStore",
    --       "keyChainAccount": "BeaconStoreKey"
    --     },
    --     {
    --       "service": "LocalStorage",
    --       "username": "findmylocate",
    --       "keyChainService": "LocalStorage",
    --       "keyChainAccount": "findmylocate"
    --     },
    --     {
    --       "service": "ProtectedCloudStorage",
    --       "username": "default",
    --       "keyChainService": "ProtectedCloudStorage",
    --       "keyChainAccount": "default"
    --     },
    --     {
    --       "service": "CloudStorage",
    --       "username": "findmylocate",
    --       "keyChainService": "CloudStorage",
    --       "keyChainAccount": "findmylocate"
    --     },
    --     {
    --       "service": "CloudKitCache",
    --       "username": "FindMyCloudKit",
    --       "keyChainService": "CloudKitCache",
    --       "keyChainAccount": "FindMyCloudKit"
    --     },
    --     {
    --       "service": "com.apple.continuity.encryption",
    --       "username": "handoff-own-encryption-key",
    --       "keyChainService": "com.apple.continuity.encryption",
    --       "keyChainAccount": "handoff-own-encryption-key"
    --     },
    --     {
    --       "service": "com.apple.NetworkServiceProxy.ProxyToken",
    --       "username": "CloudFlare",
    --       "keyChainService": "com.apple.NetworkServiceProxy.ProxyToken",
    --       "keyChainAccount": "CloudFlare"
    --     },
    --     {
    --       "appName": "Chilkat",
    --       "service": "çözツ新",
    --       "domain": "local",
    --       "username": "Matt",
    --       "keyChainService": "Chilkat/çözツ新",
    --       "keyChainAccount": "local/Matt"
    --     },
    --     {
    --       "service": "AirPort",
    --       "username": "FP Public WiFi",
    --       "keyChainService": "AirPort",
    --       "keyChainAccount": "FP Public WiFi"
    --     }
    --   ]
    -- }

    -- ---------------------------------------------------------------------------------------
    -- Here's sample code for parsing the JSON list of secrets.

    DECLARE @appName nvarchar(4000)

    DECLARE @service nvarchar(4000)

    DECLARE @domain nvarchar(4000)

    DECLARE @username nvarchar(4000)

    DECLARE @targetName nvarchar(4000)

    DECLARE @keyChainService nvarchar(4000)

    DECLARE @keyChainAccount nvarchar(4000)

    DECLARE @i int
    SELECT @i = 0
    DECLARE @count_i int
    EXEC sp_OAMethod @results, 'SizeOfArray', @count_i OUT, 'secrets'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @results, 'I', @i
        EXEC sp_OAMethod @results, 'StringOf', @appName OUT, 'secrets[i].appName'
        EXEC sp_OAMethod @results, 'StringOf', @service OUT, 'secrets[i].service'
        EXEC sp_OAMethod @results, 'StringOf', @domain OUT, 'secrets[i].domain'
        EXEC sp_OAMethod @results, 'StringOf', @username OUT, 'secrets[i].username'
        EXEC sp_OAMethod @results, 'StringOf', @targetName OUT, 'secrets[i].targetName'
        EXEC sp_OAMethod @results, 'StringOf', @keyChainService OUT, 'secrets[i].keyChainService'
        EXEC sp_OAMethod @results, 'StringOf', @keyChainAccount OUT, 'secrets[i].keyChainAccount'
        SELECT @i = @i + 1
      END

    EXEC @hr = sp_OADestroy @secrets
    EXEC @hr = sp_OADestroy @json
    EXEC @hr = sp_OADestroy @results


END
GO