Currently, when puppet runs as a service on windows, it executes a batch script (in a cmd.exe process), which then invokes ruby.exe. The child process then calls back into the service control manager, and that causes the service control manager to issue a warning in the application event log that a different process registered as a service than the one it launched.
Ideally, the service control manager should launch ruby.exe directly along with whatever arguments are necessary to do so.
If the puppet service is running when a new version is installed, or existing version repaired, Windows Installer may issue the warning, "The setup must update files or services that cannot be updated while the system is running. If you choose to continue, a reboot will be required to complete the setup." I believe this occurs because ruby.exe is not the executable associated with the service, so the installer just thinks the file is in use. This issue can be triggered easily by setting runinterval=5, e.g. run puppet every 5 seconds, and then trying to upgrade/repair.