none
用c++编写一个提升权限的程序老报错,求指导!!!求帮忙!!! RRS feed

  • 问题

  • #include "tchar.h"
    #include "windows.h"
    bool enableshutdownpriv()
    {
     HANDLE htoken=NULL;
     TOKEN_PRIVILEGES tkp={0};
    }
      if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
      return FALSE;
     }

    if(!lookupprivilegevalue(null,se_shutdown_name,&tkp.privilege[0].LUID)){
     CloseHandle(htoken);
     return false;
    }
    tkp.privilegecount=1
    tkp.privilege[0].attributes=se_privilege_enable;
    if(!adjuesttokenprivileges(htoken,false,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
    {
     CloseHandle(htoken);
     return false;
    }
    {
     return true;
    }

    >d:\程序\自编\自编\自编2.cpp(8) : error C2059: 语法错误 : “if”
    1>d:\程序\自编\自编\自编2.cpp(8) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
    1>d:\程序\自编\自编\自编2.cpp(8) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
    1>d:\程序\自编\自编\自编2.cpp(12) : error C2059: 语法错误 : “if”
    1>d:\程序\自编\自编\自编2.cpp(12) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
    1>d:\程序\自编\自编\自编2.cpp(12) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
    1>d:\程序\自编\自编\自编2.cpp(16) : error C2143: 语法错误 : 缺少“;”(在“.”的前面)
    1>d:\程序\自编\自编\自编2.cpp(16) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>d:\程序\自编\自编\自编2.cpp(18) : error C2059: 语法错误 : “if”
    1>d:\程序\自编\自编\自编2.cpp(19) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
    1>d:\程序\自编\自编\自编2.cpp(19) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
    1>d:\程序\自编\自编\自编2.cpp(23) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
    1>d:\程序\自编\自编\自编2.cpp(26) : error C2143: 语法错误 : 缺少“)”(在“常量”的前面)
    1>d:\程序\自编\自编\自编2.cpp(26) : error C2143: 语法错误 : 缺少“;”(在“常量”的前面)
    1>d:\程序\自编\自编\自编2.cpp(26) : error C2059: 语法错误 : “)”
    1>d:\程序\自编\自编\自编2.cpp(27) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
    1>d:\程序\自编\自编\自编2.cpp(27) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
    1>d:\程序\自编\自编\自编2.cpp(54) : fatal error C1004: 发现意外的文件尾

    2013年2月1日 4:43

答案

  • 1、下面这段代码不在函数的块内:
       if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
      return FALSE;
     }

    if(!lookupprivilegevalue(null,se_shutdown_name,&tkp.privilege[0].LUID)){
     CloseHandle(htoken);
     return false;
    }
    tkp.privilegecount=1
    tkp.privilege[0].attributes=se_privilege_enable;
    if(!adjuesttokenprivileges(htoken,false,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
    {
     CloseHandle(htoken);
     return false;
    }

    // !!!!

    {
     return true;
    }

    2、上面代码// !!!!部分或许缺少else,但是实际上这里不写else的效果是一样的。

    3、你的意思可能是:

    #include "tchar.h"
     #include "windows.h"
     bool enableshutdownpriv()
     {
      HANDLE htoken=NULL;
      TOKEN_PRIVILEGES tkp={0};
       if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
       return FALSE;
      }
    
    if(!lookupprivilegevalue(null,se_shutdown_name,&tkp.privilege[0].LUID)){
      CloseHandle(htoken);
      return false;
     }
     tkp.privilegecount=1
     tkp.privilege[0].attributes=se_privilege_enable;
     if(!adjuesttokenprivileges(htoken,false,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
     {
      CloseHandle(htoken);
      return false;
     }
     {
      return true;
     }
    
    }

    2013年2月6日 14:00