Android essentials does when installing applications. Each app gets a group assigned to it, and only that group can access the data for the app. In a Unix based system this is rather simple to implement. Windows gets a bit harder.
Access Control Lists
What you can do is create a custom Discretionary Access Control List (DACL) for your application. These can be converted into Security Descriptors which can be used with functions like CreateDirectory. The DACL will contain all the information about who can access the folder. In this case you'll probably want to create a Windows group for the application.
When you create your directory you can restrict access to the DACL you create. When your application runs/needs to access the directory it acquires the DACL, and uses it in subsequent system calls. These aren't the easiest Windows object in the world to work with, but they do what you want.
More than you probably want to know about Windows security descriptors and access control.
More on Creating DACLs
Creating Users
You can create a User Profile in Vista+. More than a little tricky because Windows wasn't designed for this. Impersonating a logged on user requires some type of access token for the user you're attempting to use. There are multiple functions that would return such a token:
BOOL WINAPI ImpersonateLoggedOnUser(
_In_ HANDLE hToken
);
hToken [in]
A handle to a primary or impersonation access token that
represents a logged-on user. This can be a token handle returned by a
call to LogonUser, CreateRestrictedToken,DuplicateToken,
DuplicateTokenEx, OpenProcessToken, or OpenThreadToken functions. If
hToken is a handle to a primary token, the token must have TOKEN_QUERY
and TOKEN_DUPLICATE
access. If hToken is a handle to an impersonation
token, the token must have TOKEN_QUERY
and TOKEN_IMPERSONATE
access.
LogonUser requires a password. You probably don't want to hardcode one into your application. DuplicateToken only generates impersonation tokens, which can't be used with CreateProcessAsUser (which is our end goal). Now we're left with a bunch of functions that require an existing token to duplicate and start from. That means you're left with the current user's token which is not what you want.
Creating tokens is pretty much out of the question. That operation is often only done by LSASS, and I wouldn't be surprised if this whole behavior was flagged by Anti-viruses. In Windows this approach is probably a bad idea, and not worth the amount of flaming hoops you would have to jump through to make it work.