A Windows service will create a named kernel object (i.e., semaphore, event, etc.) in the global namespace.
Unless the name of a kernel object is prefixed with "Global" an application running in an interactive session will create/open the object in that session's namespace. This is not the same object that was created by the service. So the application should use the "Global"prefix to obtain a handle to a semaphore created by a Windows service or create a kernel object that a Windows service will access.
The next obstacle to deal with is security. For example, a Windows Service running under the SYSTEM account that calls CreateSemaphore and passes NULL as the lpSecurityAttributes parameter will create an object with a default security descriptor that allows access to SYSTEM and the Administrators group. Consequently the call to CreateSemaphore by an application running under a user account will fail with an Access denied error. So if the Windows service creates the semaphore it should provide for a security descriptor that allows access to the user account that is running in the interactive session.