-1

指定されたディレクトリ (ログイン資格情報を含むローカルまたは共有パス) に書き込み権限があるかどうかを知る必要があります。

GetFileAttributes を使用していますが、常に FILE_ATTRIBUTE_DIRECTORY のみを返します。

私のコードは以下のようなものです

if(storageLocation != "")
{
    //! check if local storage - user name password would be empty
    if(storageUsername == "" && storagePassword == "")
    {
        //! local storage
        //! lets check whether the local path is a valid path or not
        boost::filesystem::path fpath(storageUsername.c_str());
        if(boost::filesystem::exists(fpath))
        {
            DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
            if((attrib != INVALID_FILE_ATTRIBUTES) && 
              ((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
            {
                string strWritePermission = "TRUE";
            }
        }
    }
    else
    {
        uncLocation_t uncLocation;
        uncLocation.m_location = storageLocation;
        uncLocation.m_username = storageUsername;
        uncLocation.m_password = storagePassword;
        if(0 == connectToUNCLocation(uncLocation)) // My function to connect to UNC location
        {
            //! successful connection
            DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
            if((attrib != INVALID_FILE_ATTRIBUTES) && 
               ((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
            {
                string strWritePermission = "TRUE";
            }
        }
    }
}

理由はわかりませんが、GetFileAttributes は常に 0x16 を返します。

共有フォルダーを作成し、その中に2つのフォルダーを作成してテストしました。1 つは読み取り専用のアクセス許可で、もう 1 つはデフォルトのアクセス許可です。ただし、3 つのケース (共有フォルダー、読み取り専用フォルダー、および既定のアクセス許可フォルダー) のすべてで、同じ戻り値が得られます。

書き込み許可を見つけて、一時ファイルを作成し (GENERIC_WRITE モードで inf CreateFile を使用)、正常に作成された場合は削除する方法があります。ただし、ユーザーが場所を指定するたびにアプリケーションで一時ファイルを作成したくないため、この方法は使用したくありません。

何をすべきか提案してください。

4

2 に答える 2

2

Windows が実行するセキュリティ チェックを複製する必要があります。AccessCheck機能はそれを助けます。現在、ファイル属性を確認することは十分に可能です。Windows のセキュリティは、それよりもはるかに複雑です。

やりたくないと言っていましたが、正しい解決策はチェックしようとしないことです。やろうとしていることは何でもやるだけです。ユーザーに十分な権限がないとシステムが判断した場合、CreateFileは失敗し、最後のエラーが に設定されERROR_ACCESS_DENIEDます。一時ファイルは必要ありません。自分がやっていることは何でもやろうとして、それを失敗させてください。セキュリティだけでなく、ファイル操作が失敗する多くの方法があるため、とにかく失敗を処理する必要があります。

ことわざにあるように、許可よりも許しを求めるほうがよいです。

于 2013-11-15T07:07:17.720 に答える
1

AccessCheckを探していると思います。参考までに、これは C++ の質問ではなく、Windows API の質問です。

于 2013-11-15T07:00:14.387 に答える