http://channel9.msdn.com/posts/jmazner/How-To-Tell-Vistas-UAC-What-Privelege-Level-Your-App-Requires/
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1439749&SiteID=1 (Might work)
#include "stdafx.h" // includes <tchar.h>
#include <windows.h>
#include <shobjidl.h> // ShellLink
#include <shlobj.h> // IShellLinkDataList (build on Vista use shobjidl.h)
#include <objbase.h> // CoInitialize, CoInitializeEx, CoUninitialize
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT result;
WCHAR wbuf[MAX_PATH];
IShellLink* link;
IPersistFile* file;
char szFile[MAX_PATH];
char szProgramMenuFolder[MAX_PATH];
// SHOULD use CoInitializeEx, but compiler can't find it.
result = CoInitialize(NULL); // For Ex: 2nd param: COINIT_APARTMENTTHREADED
// Create IShellLink object
result = CoCreateInstance(CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(void**)&link);
if (result != S_OK) {
CoUninitialize();
return -1;
}
// Retreive the IPersistFile
result = link->QueryInterface(IID_IPersistFile, (void**)&file);
if (result != S_OK) {
link->Release();
CoUninitialize();
return -2;
}
// SHOULD get from registry.
strcpy(szProgramMenuFolder, "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\");
// DEBUG
strcpy(szFile, szProgramMenuFolder);
// SHOULD use your folder and shortcut name.
strcat(szFile, "Program Shortcut Folder\\Shortcut.lnk");
// Convert the filename
MultiByteToWideChar(CP_ACP, 0, szFile, -1, wbuf, sizeof(wbuf)-1);
// Load the link data from the file
result = file->Load(wbuf, STGM_READ);
if (result != S_OK) {
file->Release();
link->Release();
CoUninitialize();
return -3;
}
// Look for IShellLinkDataList interface
IShellLinkDataList* pdl;
result = link->QueryInterface(IID_IShellLinkDataList, (void**)&pdl);
if (result != S_OK) {
file->Release();
link->Release();
CoUninitialize();
return -4; // Where did IShellLinkDataList go?
}
DWORD dwFlags = 0;
result = pdl->GetFlags(&dwFlags);
if (result != S_OK) {
pdl->Release();
file->Release();
link->Release();
CoUninitialize();
return -5;
}
// Only set SLDF_RUNAS_USER if it's not set, otherwise
// SetFlags returns an error.
if ((SLDF_RUNAS_USER & dwFlags) != SLDF_RUNAS_USER) {
result = pdl->SetFlags(SLDF_RUNAS_USER | dwFlags);
if (result != S_OK) {
pdl->Release();
file->Release();
link->Release();
CoUninitialize();
return -6;
}
}
else {
pdl->Release();
file->Release();
link->Release();
CoUninitialize();
return 0;
}
result = file->Save(NULL, true);
if (result != S_OK) {
pdl->Release();
file->Release();
link->Release();
CoUninitialize();
return -8;
}
result = file->SaveCompleted(NULL);
if (result != S_OK) {
pdl->Release();
file->Release();
link->Release();
CoUninitialize();
return -9;
}
pdl->Release();
file->Release();
link->Release();
CoUninitialize();
return ERROR_SUCCESS;
}