3

Dで新しいファイルを作成しようとしています:c /c++でドライブ

Windowsの書き込み権限を取得するためのこのコードを見つけましたが、機能しません

誰かが私が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 . . .
4

2 に答える 2

4
  1. SeSecurityPrivilege「監査とセキュリティログの管理」ユーザー権利です(特権定数のリストを参照)。ファイルの書き込みとはまったく関係ありません。実際、通常の状況では、プロセスを管理者として実行する必要がありますが、ドライブのルートにファイルを書き込むための特権を有効にする必要はありません。

  2. エラー1300は、「参照されているすべての特権またはグループが発信者に割り当てられているわけではない」ことを意味します。つまり、プロセスに権限がないため、権限は正常に有効化されませんでした。これは、プロセスが管理者として実行されていないためです。

したがって、最初に、例のほとんどすべてのコードを削除できます。実際にファイルを書き込む4行を除くすべてのコードを削除できます。次に、管理者としてアプリケーションを実行する必要があります。

これを行うには、実行可能ファイルを右クリックして、[管理者として実行]を選択します。この方法でアプリケーションを実行すると、ファイルを書き込むことができます。(注:Windows XPでは、これを行う必要はありませんが、管理者権限を持つユーザーとしてログインする必要があります。)

于 2012-07-01T21:34:35.030 に答える
2

AdjustTokenPrivilegesは、トークンに特権を追加したり、トークンから特権を削除したりすることはできません。現在無効になっている既存の特権のみを有効にするか、現在有効になっている既存の特権を無効にすることができます。

エラー1300は、「SeSecurityPrivilege」がまだないことを意味します。したがって、これを有効または無効にすることはできません。

詳細については、以下を確認してください: トークン内の特権の変更

于 2012-07-30T10:47:41.847 に答える