2012-01-19 8 views
0

AdjustTokenPrivileges経由でWindowsユーザーがシステム時刻を手動で変更する機能を無効にする方法はありますか?私はから入手したトークンにSeSystemtimePrivilegeを無効にするには、以下の機能を使用してい

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); 

機能がエラーなしで実行されますが、Windows 7に手動で時刻を変更する機能はまだ有効になっています。これは私が現在のプロセス(私のプログラム)のための特権を設定していて、現在のユーザーではないということだと思います。現在ログインしているユーザーのアクセストークンを取得する方法はありますか?または、日付/時刻コントロールパネルのトークンを取得する必要がありますか?それとも、これに近い方法がありますか?

再び、目標は、Win7のログインユーザーがシステム時間を変更できないようにすることです。ターゲットマシン上でグループポリシーにアクセスする権限がないため、この機能をプログラムで無効にする必要があります。プログラムはATL/MFCなので、CAccessTokenクラスにアクセスすれば助けになるはずです。

BOOL SetPrivilege(
    HANDLE hToken,   // access token handle 
    LPCTSTR lpszPrivilege, // name of privilege to enable/disable 
    BOOL bEnablePrivilege // to enable or disable privilege 
    ) 
{ 
    TOKEN_PRIVILEGES tp; 
    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; 
    } 

    tp.PrivilegeCount = 1; 
    tp.Privileges[0].Luid = luid; 
    if (bEnablePrivilege) 
     tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    else 
     tp.Privileges[0].Attributes = 0; 

    // Enable the privilege or disable all privileges. 

    if (!AdjustTokenPrivileges(
      hToken, 
      FALSE, 
      &tp, 
      sizeof(TOKEN_PRIVILEGES), 
      (PTOKEN_PRIVILEGES) NULL, 
      (PDWORD) NULL)) 
    { 
      printf("AdjustTokenPrivileges error: %u\n", GetLastError()); 
      return FALSE; 
    } 

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) 

    { 
      printf("The token does not have the specified privilege. \n"); 
      return FALSE; 
    } 

    return TRUE; 
} 
+0

Vista以外(管理者またはパワーユーザーとして実行していない場合はXP)からシステムの日付/時刻を変更することはできませんので、これは必要ありません。管理者であれば(アプリが高度を要求していなければならない)、特権を無効にすることはできません。 (私は「わからない」と言っていますが、「できません」ではありません。) –

+0

プログラムをインストールして実行するユーザーは管理者になる可能性があります。残念ながら、私はそれを支配していません。 – jeffm

+0

あなたのプロセスは、アドミニストレーターへの昇格を特に要求しない限り、プロセスを起動したユーザーと同じアクセスで実行されています。アプリが管理者権限で実行されていない場合、権限を変更することはできません。そうであれば、Adminのトークンを取得しているので、管理者がシステム時間を変更できないようにすることはできません。私は、すべての非管理者がグローバルに行う唯一の方法は、グループポリシーを使用することだと確信しています。個人のアクセストークンを取得し、その特定のトークンの特権を設定/削除する必要がある個々のユーザーのためにそれを行うには。再び、これは確かではありません。 :) –

答えて

3

AdjustTokenPrivileges()は、現在のプロセスにのみ影響します。 LsaRemoveAccountRights()を使用することもできますが、それは達成しようとしていることにとっては極端です。また、ユーザーが管理者の場合は、そのアカウントの権利を再付与することもできます(ログアウトして再度ログインするまでは、その効果はありません)。

あなたが何をしようとしていても、ビジネスロジックのクライアントマシンに依存することは間違った方法です。

0

コメントと以前の回答が既に指摘しているように、あなたは非常に大きなハンマーが必要です。そのようなハンマーが1つあります:GINA.DLLWinLogonによって実行されるログオン処理は、カスタムGINA.DLLを提供することによってtailoredにすることができます。

関連する問題