1.判断UAC是否启动
BOOL _stdcall IsRunUAC()//判断是否启动UAC
{
BOOL bRet = FALSE;
LONG lErr;
HKEY hKEY;
DWORD dwEnableLUA;
DWORD dwType = REG_DWORD;
DWORD dwSize = sizeof( DWORD );
if( IsVISTA() )
{
lErr = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T(“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\”),
0,
KEY_READ,
&hKEY );
if( lErr == ERROR_SUCCESS )
{
lErr = RegQueryValueEx( hKEY,
_T( “EnableLUA” ),
NULL,
&dwType,
(BYTE*)&dwEnableLUA,
&dwSize );
if( lErr == ERROR_SUCCESS )
{
if( 0 == dwEnableLUA )
{
bRet = FALSE;
}
else
{
bRet = TRUE;
}
}
else;
RegCloseKey( hKEY );
}
else;
}
else;
return bRet;
}
以上代码是判断一个注册表键值,不是正规方式。UAC启动要通过重起系统完成,这个标志位不表示当前UAC状态,所以此代码要在系统启动时执行才有效。
2.解决UAC打开时,不同权限之间的应用程序间不能广播消息
Vista UAC打开时,不同权限的应用程序广播消息是收不到的。
UINT UIBroadcastCommand = ::RegisterWindowMessage( SNA_MESSAGE );
ON_REGISTERED_MESSAGE( UIBroadcastCommand, OnFromMessage )
将以下代码加入程序启始位置
BOOL AllowMeesageForVista( UINT uMessageID, BOOL bAllow )//注册Vista全局消息
{
BOOL bResult = FALSE;
HMODULE hUserMod = NULL;
do
{
//vista and later
hUserMod = LoadLibrary( “User32.dll” );
if( NULL == hUserMod ) break;
_ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, “ChangeWindowMessageFilter” );
if( NULL == pChangeWindowMessageFilter )break;
bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
}
while( 0 );
if( NULL != hUserMod )
{
FreeLibrary( hUserMod );
}
else;
return bResult;
}
这里使用Vista提供的标准函数ChangeWindowMessageFilter注册一个全局消息。但是由于系统服务与应用程序间的session不同,所以应用程序无法响应系统服务的广播消息。
3. 系统服务与应用程序的事件通讯
在Vista中高权限进程创建的事件使用低权限进程是无法open的(其它windows也一样)。在创建事件时使用以下代码
DWORD _stdcall MyCreateEvent( HANDLE* phEvent, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName )
{
DWORD dwRet = 0;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
EXPLICIT_ACCESS ea[1];
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pACL = NULL;
SECURITY_ATTRIBUTES sa;
*phEvent = NULL;
////////////////////////
do
{
// Create a well-known SID for the Everyone group.
if( !AllocateAndInitializeSid( &SIDAuthWorld,
1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID ) )
{
dwRet = GetLastError();
break;
}
else;
// Initialize an EXPLICIT_ACCESS structure for an ACE.
ZeroMemory( &ea, sizeof(EXPLICIT_ACCESS) );
ea[0].grfAccessPermissions = EVENT_ALL_ACCESS;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
// Create a new ACL that contains the new ACEs.
dwRet = SetEntriesInAcl( 1, ea, NULL, &pACL );
if( ERROR_SUCCESS != dwRet )
{
break;
}
else;
// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR)LocalAlloc( LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH );
if( NULL == pSD )
{
dwRet = GetLastError();
break;
}
else;
if( !InitializeSecurityDescriptor( pSD, SECURITY_DESCRIPTOR_REVISION ) )
{
dwRet = GetLastError();
break;
}
else;
// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl( pSD,
TRUE, // bDaclPresent flag
pACL,
FALSE ) ) // not a default DACL
{
dwRet = GetLastError();
break;
}
else;
// Initialize a security attributes structure.
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;
////////////////
*phEvent = CreateEvent( &sa, bManualReset, bInitialState, lpName );
if( NULL == *phEvent )
{
dwRet = GetLastError();
break;
}
else;
}
while( 0 );
//////////
if( pEveryoneSID )
{
FreeSid( pEveryoneSID );
}
else;
if( pACL )
{
LocalFree( pACL );
}
else;
if( pSD )
{
LocalFree(pSD);
}
else;
return dwRet;
}
(文章来自:码农源库
http://www.vcclass.net/wordpress/?p=26)
分享到:
相关推荐
3. **readme.txt**:这是一个常见的文本文件,通常包含软件的安装指南、使用说明、注意事项或者版权信息。用户在安装和使用软件之前应该先阅读此文件,以了解软件的正确使用方法和可能的限制。 综上所述,这个...
#### 四、注意事项 - **测试**:在应用任何兼容性设置之前,请确保先在一台测试机器上进行尝试,避免对生产环境造成不必要的影响。 - **备份**:在修改注册表或系统文件之前,请务必做好备份,以防万一出现问题时...
标签中的"xptovista"和"xptovista.zip"进一步确认了文件的主题,这可能是一个专门针对XP到Vista升级的解决方案。 "说明_Readme.html"是常见的压缩包内文件,它通常包含有关如何使用包含的文件、注意事项、系统要求...
2. 如果你的电脑是预装Vista的品牌机,没有安装光盘,可以寻找其他解决方案,例如通过网络下载安装文件。 完成以上步骤后,重启电脑,你将看到多系统启动菜单,可以选择启动Windows Vista或新安装的Windows XP/2003...
#### 三、项目开发注意事项 在进行项目开发时,应注意以下几点: - **软件兼容性**:确保所使用的开发工具和系统环境符合项目要求,避免因软件版本不兼容导致的问题。 - **数据库初始化**:对于依赖数据库的项目,...
- 在安装过程中遇到任何错误时,记录下错误代码,并搜索相应的解决方案。 - 安装完成后,确保所有组件都能正常工作,并进行必要的更新或补丁安装。 #### 结论 通过上述步骤,用户可以在 Windows Vista 操作系统上...
【vista ghost】这个标签表明该工具是专门针对Vista系统的Ghost解决方案。在Windows Vista系统中,由于系统级别的改变,传统的Ghost方法可能不再适用。VistaGhost通过优化和适应Vista环境,确保了Ghost程序的兼容性...
### Android开发工具手册知识点解析 ...以上内容详细介绍了《Android开发工具手册》中的关键知识点,包括主要功能的操作指南、常见问题的解决方法以及使用过程中的注意事项,旨在帮助开发者更好地理解和使用该工具。
这三者共同构成了H-JTAG的完整调试解决方案。 H-JTAG支持所有基于CORTEX-M3、ARM7、ARM9和XSCALE芯片的调试,并能支持LITTLE-ENDIAN及BIG-ENDIAN数据格式,THUMB及ARM指令集,并兼容SEMIHOSTING技术。H-JTAG还支持...
#### 二、解决方案概述 鉴于上述变化,本文介绍了一种新的引导方法,即通过一个名为MouseDos工具箱的软件来实现Beini在Win7或Vista系统上的引导。MouseDos工具箱是基于Grub源代码开发的,集成了许多DOS下的实用工具...
对于那些想要在早期Windows版本上使用Vista Gadgets的用户,以下是一些步骤和注意事项: 1. 安装Gadget支持:Windows XP和Windows 7默认不支持Gadgets,需要下载并安装“Windows Sidebar for Windows XP”或...
6. **开发注意事项**:在使用此源代码时,开发者需要了解Windows SDK和C/C++编程,因为Core Audio API通常用这些语言实现。同时,由于源代码不适用于XP,开发者需要额外处理版本检测和兼容性问题,以确保在不同版本...
- **解决方案**: - 在自定义 SDK 时,以模拟器版本的 SDK 为例,进行必要的配置。 - 关键步骤在于调整编译选项,取消勾选 ENABLE KITL(no IMGNOKITL)选项,重新编译生成模拟器版本的内核。 #### 四、总结 通过以上...
总结来说,本篇问题集锦提供了在Vista系统上安装Ampla Web客户端时可能遇到的特定错误代码2869的解决方案,并包含了操作的注意事项和免责声明,对于使用Vista系统的用户来说,是一个宝贵的故障排查参考资料。
在Windows 7旗舰版上搭建WinCE 6.0开发环境虽然存在一定的挑战,但通过仔细遵循上述步骤和注意事项,可以有效克服这些困难。确保所有软件和服务包正确安装,并注意权限问题和兼容性问题,可以显著提高开发环境的稳定...
解决方案是重启电脑后重新安装软件,避免冲突。 4. **杀毒软件对Pilot Pioneer的影响**: - 以卡巴斯基为例,在安装DL-WLAN协议时,如果杀毒软件对DLNDISPROT.SYS进行主动防御,用户需要选择“允许操作”以确保...
6. **注意事项** - 编译完成后,生成的库文件(如CEGUIOgreRenderer.lib和CEGUIOgreRenderer.dll)可用于基于OGRE的应用中集成CEGUI。 - 如需使用其他渲染器,如CEGUIDirect3D10Renderer,同样可以在`config.lua`...