サービスからネットワーク上のファイルを操作する方法


ナオト  2011-02-23 22:58:18  No: 72358

サービスプログラム上からWNetAddConnection2関数を使用して、ネットワーク上のファイルを操作するプログラムを作成しています。
このとき、ネットワーク上のファイルのオープンで失敗し、GetLastError()で確認したところアクセスが拒否された(5)と返ってきます。
WNetAddConnection2()は成功しているみたいなのですが、ファイル操作ができない原因がわかりません。
どのように修正を行えばよいのかお分かりの方がいましたら教えてただけないでしょうか?

・以下サンプルソース
NETRESOURCE stRes;
memset(&st,NULL,sizeof(NETRESOURCE));
stRes.dwType      = RESOURCETYPE_DISK;
stRes.lpRemoteName    = _T("\\\\fileserver");
stRes.lpLocalName    = NULL;
stRes.lpProvider    = NULL;

DWORD dwRet = WNetAddConnection2(&stRes,_T("pass"),_T("user"),0);
_tprintf(_T("  WNetAddConnection2 = %d \n"),dwRet);
if(dwRet != NO_ERROR) {
    _tprintf(_T("  Error!! : WNetAddConnection2 \n"));
}

//ファイルパス
CString strPath = _T("\\\\fileserver\\user\\test.txt");
CFile cFile;
if( !cFile.Open(strPath,CFile::modeRead) ) {
    DWORD dw = GetLastError();
    _tprintf(_T("**** Error!! : Open NG (Err=%d) \n"),dw);
}
else {
    _tprintf(_T("**** Open Net Drive File \n"));
}


tetrapod  2011-02-24 00:53:58  No: 72359

「サービス」は実効ユーザが SYSTEM だったり LOCAL SERVICE だったりするので
ログイン者の権限とは異なるアカウント・権限で動作しているため。
要するにサービスにはネットワークファイルを開く権限が無いってこと。

どう解決すればよいかは、要件次第。セキュリティ的考察が必須。
サービスに権限を与える=セキュリティホールを自ら開けている、
ともいえるわけで、無造作に無考慮に権限を与えてよいわけではない。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加