ファイルのアクセス権の取得方法とエラーの原因について

このQ&Aのポイント
  • ファイルのアクセス権を取得する処理を記述しましたが、FD内のファイルについてはエラーが発生しています。
  • GetFileSecurityでSecurityDescにTRUEが返ってきており、paclには何も返ってきていないため、GetAclInformationでエラーが発生しています。
  • Windows 2000とVisual C++ 6.0の環境下での問題です。解決策を教えてください。
回答を見る
  • ベストアンサー

ファイルのアクセス権の取得

こんにちは。いつもお世話になっております。 ファイルのアクセス権を取得する処理を記述していて行き詰まってしまいました。 今、指定ファイルに対してアクセス許可、アクセス拒否が設定されているか取得する関数を作成しています。 ------------------------------------------------- //AceType --> ACE種別(1:アクセス許可 2:アクセス拒否) psd = GlobalAlloc(GMEM_FIXED, 1000); //ファイルのセキュリティ情報取得 GetFileSecurity(DirPath, DACL_SECURITY_INFORMATION, psd, 1000, &sdsize); GetSecurityDescriptorDacl(psd, &DaclPresent, &pacl, &DaclDefaulted); if(!DaclPresent){ //随意ACLがない GlobalFree(psd); return 0; } else{ GetAclInformation(pacl, &AclSize, sizeof(AclSize), AclSizeInformation); AceCount = AclSize.AceCount; for(i = 0; i < AceCount; i++){ //ACE取得 GetAce(pacl, i, (LPVOID *)&pace); if(AceType == 1 && pace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE){ //アクセス許可 break; } if(AceType == 2 && pace->Header.AceType == ACCESS_DENIED_ACE_TYPE){ //アクセス拒否 break; } } GlobalFree(psd); return 1; } ------------------------------------------------- 通常のファイルについてはうまく取得できているようですが、FD内のファイルについてアクセスするとエラーとなってしまいます。 どうやら「GetFileSecurity」で「SecurityDesc」にTRUEが返ってきているようなのです。 しかし、当然「pacl」には何も返ってこないため、「GetAclInformation」でエラーとなります。 なぜ、「SecurityDesc」にTRUEが返ってきてしまうのでしょうか? どうかご教示下さい。 <環境> Windows 2000, Visual C++ 6.0

質問者が選んだベストアンサー

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

ファイルのアクセス権の対象となるのは、NTFSのディスクシステムです。 フロッピーは対象でないですね。 Win32サブルーチンズ - Windows NTでファイルにアクセス権を設定する方法 http://www7a.biglobe.ne.jp/~tsuneoka/win32tech/10.html | ファイルシステムがNTFS(NT File System)でフォーマットされたディスクのみが利用できます. -- > なぜ、「SecurityDesc」にTRUEが返ってきてしまうのでしょうか? 「GetFileSecurity」関数の実行結果を確認してください。 処理自体が失敗している場合、「SecurityDesc」変数の内容は保証されません。

sputnik8823
質問者

お礼

neKo_deuxさん、回答ありがとうございます。 >ファイルシステムがNTFS(NT File System)でフォーマットされたディスクのみが利用できます。 なるほど。そういうことだったのですね。 ただ、「GetFileSecurity」関数の実行結果を確認したところTRUEが返ってきているようでした。 (ちなみに「GetSecurityDescriptorDacl」関数もTRUEを返しました) 他に原因があるのでしょうか?

関連するQ&A

  • アクセスからアクセスファイルを開くには?

    アクセスからアクセスファイルを開きたいのですがうまく出来ないので教えてください。 Option Compare Database Option Explicit Sub test() Dim App As Access.Application Dim MyFileName As String Set App = CreateObject("Access.Application") MyFileName = CurrentProject.Path & "\アクセスファイル名.mdb" With App .Visible = True End With Set App = Nothing End Sub で、 .Visible = True でアプリケーションは開きますが Set App = Nothing を通過すると開いたアプリケーションが閉じてしまいます。 それにアプリケーションが開くだけで肝心のファイルが開かれません。 なので「.ファイルを開くVBAコード」が必要だと思うのですがそのコードがわかりません。

  • 消せないファイル

    消せないファイルがあります。 アクセス拒否されているみたいです。 アクセス許可設定をするのにオブジェクトの所有権を 取得する必要があるそうなのですが、 その設定もできません。 「新しい所有者を設定できません。アクセスが拒否されました」 と出ます。 どなたかご存じありませんか? お願いします。

  • ディレクトリ内のファイル名取得

    maruchan と言うものです。 よろしくお願いします。 さっそく質問 環境 cygwin gcc version 3.3.1 やりたい処理は、ディレクトリ内の全てのファイル名を取得したいと思っています。 内容を見ると単純ですが、そのファイルの数が約10万ファイルぐらいありまして・・・ファイル名を取得するだけで結構な時間が掛かってしまいます。 そこで 私が質問したいのは 高速にファイル名を取得する方法はないのか知りたいです。 私が書いたサンプルです。 /*******************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <dirent.h> int fileSelector (const struct dirent *entry); int main(void) { int i = 0; int dirCnt = 0; struct dirent **dp = NULL; char dirPath[256]; strcpy(dirPath, "./file/"); dirCnt = scandir(dirPath, &dp, fileSelector, alphasort); for(i=0; i < dirCnt; i++) { /* 本来はここでファイル名を何かに登録する */ dp[i]->d_name; } free(dp); return 0; } int fileSelector (const struct dirent *entry) { if (strcmp (entry->d_name, ".") == 0 || strcmp (entry->d_name, "..") == 0) { return 0; } return 1; } /*******************/

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • C++でcsvファイルから文字列を取得するのに

    C++でcsvファイルから文字列を取得するというものを作っているのですが、うまく取り出すことができません。ファイルはオープンできて、文字列にも分けられているのだとは思うのですが、どこのデータを表示させても"1aa"としか表示されません。なにも格納されていない所は"1aa"とは表示されず空白ですが。 以下に取り出す際使用しているコードを記載するので、うまい具合にいくアドバイスがありましたらお願いします。 ↓で格納させる場所を作っています。 typedef struct { char* Input; char* Output; char* AddName; char* Path; char* LED; int VS; char* Title; char* Copy; } csvdata_t; csvdata_t csvdata[100]として別の場所で宣言してます ↓この関数で格納させています void loadData(){     FILE *fp;    fp = fopen(csvTitle,"r");//ここでのファイルパスは通っています    int n,num,i;        int input[1024]; char inputc[1024]; for(i = 0; i < 1; i++)//最初の1行読み飛ばす while(fgetc(fp) != '\n'); n = 0; num = 0; while(1){ for(i = 0;i < 64; i++){ inputc[i] = input[i];// = fgetc(fp);//1文字取得する input[i] = fgetc(fp); if(inputc[i] == '/'){//スラッシュがあれば while(fgetc(fp) != '\n');//改行までループ i = -1;//カウンタを最初に戻して continue; } if(input[i] == ',' || input[i] == '\n'){//カンマか改行なら inputc[i] = '\0';//そこまでを文字列とし break; } if(input[i] == EOF){//ファイルの終わりなら goto EXFILE;//終了 } } switch(num){ case 0: csvdata[n].Input = inputc;break; case 1: csvdata[n].Output = inputc;break; case 2: csvdata[n].AddName = inputc;break; case 3: csvdata[n].Path = inputc;break; case 4: csvdata[n].LED = inputc;break; case 5: csvdata[n].VS = atoi(inputc);break; case 6: csvdata[n].Title = inputc;break; case 7: csvdata[n].Copy = inputc;break; case 8: break; } num++; if(num == 9){//9まできたら num = 0;//0に戻す n++;//次の行へ } } EXFILE: fclose(fp); }

  • Vistaのアクセス権に関して

    先日Vistaへのグレードアップを行ったのですが、あるフォルダのアクセス権をフルコントロールが許可になってるのを、すべて拒否に変更しました。フォルダ内にある全てのファイルが拒否になったのはいいのですが、いざ許可に戻そうとすると「拒否されました」とメッセージが出てアクセスできません。フォルダ及びファイルを一つづつなら許可にできるのですが、時間がかかって仕方ありません。最初にフォルダで拒否にしたので一括で元の許可の状態に戻せないものかと思っているのですが、こつこと一つづつ戻していくか、拒否されてるフォルダやファイルは諦めて一から作り直さないといけないのでしょうか。もし方法があるならどれも大事なファイルなので教えて頂きたいと思います。

  • ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込

    ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込みプログラム」をそのままコンパイルして実行しようと思ったのですが、 sample.c: In function 'main': sample2.c:9: warning: return type of 'main' is not 'int' と、表示されてしまいます。 プログラミング初心者なので、どこが間違っているのかわかりません。 回答またはアドバイスの程、よろしくお願いいたします。 ネットで落ちていたプログラムを以下に記載します。 sample2.c #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("コマンドの入力形式が間違っています.\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("ファイルがオープンできません[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("データが不正です[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("エラー(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("エラー(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("エラー(3)\n"); break; } if(*wp != '\0'){ printf("エラー(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); }

  • アクセス制限

    以下スクリプトは$denyに拒否したいリストを記述するのですが、$denyに記述したリストのみをアクセス許可にしたいと思っています。試しに2行目の$flag=0;を$flag=1;にし、4行目$flag=1;を$flag=0;にしましたところ、$denyに記述したリストのみアクセス許可することができたようですが、これで問題ないでしょうか?よろしくお願いいたします。 if ($deny) { $flag=0; foreach (split(/\s+/, $deny)) { if ($host =~ /$_/i) { $flag=1; last; } } if ($flag) { &error("コメント") } }

    • ベストアンサー
    • Perl
  • _popen() のエラー取得

    WindowsNT/2000で_popen()を利用してコマンドを実行しているのですが、その際のメッセージを取得したいのですが、通常のメッセージは取得出来るのですが、エラーメッセージが取得出来ません。どうすればよいのでしょうか? 現在のソースは下記のようです。 int main(int argc, char* argv[]) { char str[512],*ptr; FILE *fp; if((fp = _popen("dir b:","rt")) == NULL) { fprintf( stderr , "error!!!\n"); return -1; } while(1) { fgets(str,512,fp); if(feof(fp)) { break; } ptr = strchr(str,'\n'); if(ptr != NULL) { *ptr='\0'; } printf("%s\n",str); } _pclose(fp); return 0; }

  • Cisco アクセスリストにつきまして

    アクセスリストについて 以下のようなアクセスリストの記述があった場合に5の access-list 101 ip any any は どういった意味をもつのでしょうか? (5があるのとないのでは何か違いがでるのでしょうか?) 自分的にはあってもなくても変わらないと思うのですが・・ (1、2が許可となりそれ以外は記述もふくめすべて拒否されるため5は意味がないような気がしますが、いかがでしょうか?) 1.access-list 101 ip permit ~ 2.access-list 101 ip permit ~ 3,access-list 101 ip deny ~ 4.access-list 101 ip deny ~ 5.access-list 101 ip any any 宜しくお願いいたします。