Don't bypass, use "Application Data" directory.
Program Files is intended to store files that do not change during run of application. Files stored there should be changed only during installation/update.
Files to be changed during application run (profiles, settings etc.) should be stored "Application Data" directory in users folder.
To obtain the path use SHGetFolderPath function passing:
CSIDL_APPDATA
- to obtain current user "Application Data" directory
CSIDL_COMMON_APPDATA
- to obtain all users "Application Data" directory
(and eventually) CSIDL_LOCAL_APPDATA
- to obtain current user "Local Application Data" directory which is intended to store informations specific only to local machine that cannot be moved to other machines, in opposition to "Application Data" (also called "Roaming Application Data") where files can be freely moved from machine to machine (i.e. you can preserve them during OS reinstallation).
If your application do really need to alter Program Files directory then asking the user for permission is that what you should do. You can give your application special manifest so it'll try to obtain administrator rights every time it's run. You can also obtain privileges on-the-fly.
If you are writing specific application that hardly interferes with the OS, then you can create a service (daemon). Every time the service is started it will obtain privileges given during service registration. For more information see "DLLs, Processes, and Threads -> Services" on MSDN
// EDIT
You can also easily crate a service in .NET (C# is most suitable). Service application can communicate with client application written in other language. But to register a service you will need administrator rights. With this kind of application you must consider all security issues.