本文介绍了我发现此代码可以获得 Windows 写入权限,但它不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 c/c++ 在 D: 驱动器上创建新文件

Im trying to create new file on D: drive with c/c++

我发现此代码可以获得 Windows 写入权限,但它不起作用

I found this code to get windows write privileges but it does not working

有人可以帮助我吗?我是 C++ 新手吗?

Can anybody help me i am new in c++?

BOOL SetPrivilege(
    HANDLE hToken,               // access token handle
    LPCTSTR lpszPrivilege,    // name of privilege to enable/disable
    BOOL bEnablePrivilege    // to enable (or disable privilege)
    )

{
    // Token privilege structure
    TOKEN_PRIVILEGES tp;
    // Used by local system to identify the privilege
    LUID luid;

    if(!LookupPrivilegeValue(
        NULL,                // lookup privilege on local system
        lpszPrivilege,    // privilege to lookup
        &luid))               // receives LUID of privilege
    {
        printf("LookupPrivilegeValue() error: %u\n", GetLastError());
        return FALSE;
    }
    else
        printf("LookupPrivilegeValue() is OK\n");

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;

    // Don't forget to disable the privileges after you enabled them,
    // or have already completed your task. Don't mess up your system :o)
    if(bEnablePrivilege)
    {
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        printf("tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED\n");
    }
    else
    {
        tp.Privileges[0].Attributes = 0;
        printf("tp.Privileges[0].Attributes = 0\n");
    }
    // Enable the privilege (or disable all privileges).
    if(!AdjustTokenPrivileges(
        hToken,
        FALSE, // If TRUE, function disables all privileges, if FALSE the function modifies privilege based on the tp
        &tp,
        sizeof(TOKEN_PRIVILEGES),
        (PTOKEN_PRIVILEGES) NULL,
        (PDWORD) NULL))
    {
        printf("AdjustTokenPrivileges() error: %u\n", GetLastError());
        return FALSE;
    }
    else
    {
        printf("AdjustTokenPrivileges() is OK, last error if any: %u\n", GetLastError());
        printf("Should be 0, means the operation completed successfully = ERROR_SUCCESS\n");
    }
    return TRUE;
}

我的主要功能

int main()
    {
    LPCTSTR lpszPrivilege = L"SeSecurityPrivilege";
    // Change this BOOL value to set/unset the SE_PRIVILEGE_ENABLED attribute
    BOOL bEnablePrivilege = TRUE;
    HANDLE hToken;
    // Open a handle to the access token for the calling process. That is this running program
    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        printf("OpenProcessToken() error %u\n", GetLastError());
        return FALSE;
    }
    else
        printf("OpenProcessToken() is OK\n");

    // Call the user defined SetPrivilege() function to enable and set the needed privilege
    BOOL test = SetPrivilege(hToken, lpszPrivilege, bEnablePrivilege);
    printf("The SetPrivilege() return value: %d\n\n", test);

        ofstream myFile;
        myFile.open("C:\\test.txt");
        myFile << "I am C";
        myFile.close();


        bEnablePrivilege = FALSE;
        BOOL test1 = SetPrivilege(hToken, lpszPrivilege, bEnablePrivilege);
        printf("The SetPrivilage() return value: %d\n", test1);
        system("PAUSE");

        return 0;
    }

控制台输出如下:

OpenProcessToken() is OK
LookupPrivilegeValue() is OK
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges() is OK, last error if any: 1300
Should be 0, means the operation completed successfully = ERROR_SUCCESS
The SetPrivilege() return value: 1

LookupPrivilegeValue() is OK
tp.Privileges[0].Attributes = 0
AdjustTokenPrivileges() is OK, last error if any: 1300
Should be 0, means the operation completed successfully = ERROR_SUCCESS
The SetPrivilage() return value: 1
Press any key to continue . . .

推荐答案

  1. SeSecurityPrivilege 是管理审核和安全日志"用户权限(请参阅 权限常量列表).它与写入文件完全无关.实际上,在正常情况下,您无需启用任何权限即可将文件写入驱动器的根目录,尽管该进程确实需要以管理员身份运行.

  1. SeSecurityPrivilege is the "Manage auditing and security log" user right (see the list of privilege constants). It has absolutely nothing to do with writing files. In fact, under normal circumstances, you don't need to enable any privilege to write a file to the root of a drive, although the process does need to be running as an administrator.

错误1300 表示并非所有引用的权限或组都分配给调用者."也就是说,特权没有成功启用,因为进程无权获得它.这是因为该进程没有以管理员身份运行.

Error 1300 means "Not all privileges or groups referenced are assigned to the caller." That is, the privilege was not successfully enabled, because the process isn't entitled to it. This will be because the process isn't being run as an administrator.

因此,首先,您可以删除示例中的几乎所有代码,除了实际写入文件的四行之外的所有内容.然后您只需以管理员身份运行应用程序即可.

So, first, you can remove almost all the code in your example, everything but the four lines that actually write the file. Then you just need to run the application as an administrator.

为此,请右键单击可执行文件并选择以管理员身份运行".如果您以这种方式运行应用程序,它将能够写入文件.(注意:在 Windows XP 中,您不需要这样做,但您需要以具有管理权限的用户身份登录.)

To do this, right-click on the executable file and select "Run as administrator". If you run the application in this way it will be able to write the file. (Note: in Windows XP, you don't need to do this, but you do need to be logged in as a user with administrative rights.)

这篇关于我发现此代码可以获得 Windows 写入权限,但它不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 01:41
查看更多