请教高手怎样使程序以administrator运行,不使用.manifest方式,因为我的程序是一个第三方调用程序,如果使用.manifest方式就必须要求调用程序一样使用.manifest

解决方案 »

  1.   

    那恐怕没什么好办法
    除非你杀掉Explorer然后重建这个进程,就可以无视UAC,但是那样会吓人的……
      

  2.   

    怎么我不懂你们说什么,vista系统的东西?
      

  3.   

    ShellExecute
    use the runas verb
      

  4.   

    手动修改24-->1资源  或者以res方式编译到exe
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity
        type="win32"
        name="CodeGear RAD Studio"
        version="11.0.2627.5503" 
        processorArchitecture="*"/>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            publicKeyToken="6595b64144ccf1df"
            language="*"
            processorArchitecture="*"/>
        </dependentAssembly>
      </dependency>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel
              level="requireAdministrator"
              uiAccess="false"/>
            </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
      

  5.   

    把manifest编译到exe,别人调用你的程序不需要使用manifest的。直接ShellExecute就可以了。RC文件
    1 24 ****.Manifest
      

  6.   

    //这是个提权函数,在WinXp下完全可以,Vista下可以试一下,没用过Vista
    procedure SetPrivilege;
    var
       OldTokenPrivileges, TokenPrivileges: TTokenPrivileges;
       ReturnLength: dword;
       hToken: THandle;
       Luid: int64;
    begin
       OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
       LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid);
       TokenPrivileges.Privileges[0].luid := Luid;
       TokenPrivileges.PrivilegeCount := 1;
       TokenPrivileges.Privileges[0].Attributes := 0;
       AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength);
       OldTokenPrivileges.Privileges[0].luid := Luid;
       OldTokenPrivileges.PrivilegeCount := 1;
       OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED;
       AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength);
    end;
      

  7.   

    UAC工作时,可用RES集成权限标志
      

  8.   

    都答非所问,楼主是问如何用API来控制UAC提升权限对话框出现,例如需要安装服务等等,才提升权限,而平时运行就不用提升了,现在很多API调用直接返回没有权限。那些连账号密码都不用,直接提升权限的代码,实际都不能执行的,否则那UAC不是白做了。
      

  9.   

    我也找了很久这种资料,可能没有API,只能调用另外一个进程,配合进程通讯来完成高权限的工作。这样你就可以用很多方法了
    1)在另外一个进程里加入manifest
    2)使用RunAsAdmin
    BOOL RunAsAdmin( HWND hWnd, LPTSTR lpFile, LPTSTR lpParameters )
    {
        SHELLEXECUTEINFO   sei;
        ZeroMemory ( &sei, sizeof(sei) );    sei.cbSize          = sizeof(SHELLEXECUTEINFOW);
        sei.hwnd            = hWnd;
        sei.fMask           = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
        sei.lpVerb          = _TEXT("runas");
        sei.lpFile          = lpFile;
        sei.lpParameters    = lpParameters;
        sei.nShow           = SW_SHOWNORMAL;    if ( ! ShellExecuteEx ( &sei ) )
        {
            printf( "Error: ShellExecuteEx failed 0x%x\n", GetLastError() );
            return FALSE;
        }
        return TRUE;
    }3)使用CoCreateInstanceAsAdmin创建COM。
    HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, __out void ** ppv)
    {
        BIND_OPTS3 bo;
        WCHAR  wszCLSID[50];
        WCHAR  wszMonikerName[300];    StringFromGUID2(rclsid, wszCLSID, sizeof(wszCLSID)/sizeof(wszCLSID[0])); 
        HRESULT hr = StringCchPrintf(wszMonikerName, sizeof(wszMonikerName)/sizeof(wszMonikerName[0]), 
    L"Elevation:Administrator!new:%s", wszCLSID);
        if (FAILED(hr))
            return hr;
        memset(&bo, 0, sizeof(bo));
        bo.cbStruct = sizeof(bo);
        bo.hwnd = hwnd;
        bo.dwClassContext  = CLSCTX_LOCAL_SERVER;
        return CoGetObject(wszMonikerName, &bo, riid, ppv);
    }估计微软实在想不出安全的方法在进程运行时改变进程的权限吧!