ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

アクセス権で悩まされました

Windowsに一般ユーザーでログインして、コマンドプロンプトから、

  1. ログインしたユーザーとは異なるユーザーで、ネットワークドライブを割り当てる。
  2. ネットワークドライブ上のファイルを処理するプログラムを起動する。

という処理を行いました。

ネットワークドライブの割り当ては、

net use E: \\192.168.1.1\datas\2016 /user:username password /persistent:yes

で行いました。

ネットワークドライブ上のファイルを処理するプログラムを

C:\soft>test.exe 1

で起動すると、

GetLastError():5

が表示されました。

こちらのページによると、GetLastError()の5は、「ERROR_ACCESS_DENIED:アクセスが拒否されました。」とあります。
ir9.jp

ネットワークドライブを割り当てたユーザーと、Windowsにログインしているユーザーが異なります。
そのため、Windowsでログインしたユーザーではネットワークドライブ上のファイルへのアクセスが拒否されているようです。
エクスプローラにEドライブとして表示されていたので、アクセスが拒否されるとは思っていませんでした。

管理者のコマンドプロンプトからならどうなる?

管理者のコマンドプロンプトから同様の手順で処理すると、処理ができました。
エクスプローラにEドライブは表示されませんが、アクセスはできています。
一般ユーザーでネットワークドライブを割り当てたわけではないので、エクスプローラには表示されないようです。

f:id:AJYA:20160802125750j:plain
photo credit: start via photopin (license)

自動で処理するためには?

Windowsに一般ユーザーでログインして、ログイン時に自動起動して処理をしたいと考えていました。
具体的には、スタートアップにネットワークドライブ割り当てとアプリケーション起動のバッチファイルを作成をします。

試しにバッチファイルを作成して実行してみましたが、コマンドプロンプトと同様に上手くいきませんでした。
Windowsの一般ユーザーでは、コマンドプロンプトからの処理で上手くいかなかったので、できない理由も同じなんでしょうね。

自動で処理を実現したかったので、Administratorユーザーを有効にして、Administratorでログインするようにしました。
スタートアップにバッチファイルを作成して実行すると、予定通りの処理ができました。

無効なアカウントを有効にするしかないのか

今回は手っ取り早く目的を達成するためにAdministratorユーザーを有効にしました。
.NET Frameworkの機能を確認してアプリケーションを作成すれば、管理者権限で起動させて対処することもできるのかもしれません。