質問者
実行ユーザにAdministartors権限がない場合に、サービスのsocket関数がWSAEINVALで失敗する。

質問
-
socket通信の待ち受けを行うサービスプログラムがあります。
とあるサーバ(WindowsServer2012R2)にこのサービスを導入し、実行ユーザを一般ユーザ(Usersグループにのみ所属)として起動したところ socket関数が異常終了する=INVALID_SOCKETを返す現象が発生しました。
エラーコードを採取したところ、
WSAGetLastError() = 10022 (WSAEINVAL)
errno = 13 (EACCES)
となっていました。発生条件は、サービスの実行ユーザに Administratorsグループ権限がない場合です。
実行ユーザに Administratorsグループ権限を付与すると正常に起動します。
(権限付与/削除の後、再起動すると正常起動/現象発生が変化します。)
このサービス自体は少々古く WinSockのバージョン指定は1.1 ですが、
反面他のサーバ(2012R2を含む)で稼働実績があり、一般ユーザで稼働しているサーバもあるので何か環境の問題かと考えています。Administartors権限の有無によって socket関数が失敗するような処理があるのでしょうか?
念のため、呼び出し部分のコードを簡単に記載しておきます。
status = WSAStartup(MAKEWORD(1,1), &WSAData);
if( status != 0 ) { ... }
main_sock = socket(AF_INET, SOCK_STREAM, 0);
if( main_sock == INVALID_SOCKET ) { ... }
すべての返信
-
socket function
サンプル コードは該当しないと思いますが 第二引数が SOCK_RAW の場合など、raw socket を扱うには管理者権限が必要のようですね。プログラム動作上の問題なので、TechNet フォーラムよりは MSDN フォーラムに投稿された方が良いかと思います。
hebikuzure
-
フォーラム オペレーターの栗下 望です。
A_Takada さん、こんにちは。Hebikuzure aka Murachi Akira さん、ご案内いただきありがとうございます。
既に MSDN フォーラムの「Visual C++」カテゴリに同様の質問を投稿いただいていましたので、本スレッドをお纏めさせていただきました。
・実行ユーザにAdministartors権限がない場合に、サービスのsocket関数がWSAEINVALで失敗する。
https://social.technet.microsoft.com/Forums/ja-JP/6757ce46-17b2-47ea-901f-08c2bf8dd080/234553489212518125401247012395administartors271773848012364123941235?forum=vcgeneraljaまた、質問内容を拝見いたしますと開発環境の記載がございませんので追記していただいたほうが情報も寄せられやすくなりますのでご検討くださいませ。
お手数ですが、ご確認の程どうぞよろしくお願いいたします。
~ 参考になった投稿には回答としてマークの設定にご協力ください ~
MSDN/TechNet Community Support 栗下 望
- 編集済み 栗下 望Microsoft employee, Moderator 2018年7月12日 0:58
-
栗下様 ありがとうございます。
Windows7上の Visual Studio 2008 で作成しています。
(大本の開発環境は Visual C++ 6 ---OS不明--- でしたが...。)サービスが稼働しているのは WindowsServer2012R2 で
先の質問で記載していませんでしたが、仮想環境となっています。
仮想環境での制限などありましたら、情報をいただきたいと思います。en-us/help/2649107「Winsock-based operations fail in Windows 7 or in Windows Server 2008 R2 if the executable file is located on an NFS share 」(URLを貼れなかったので記事のタイトルで恐縮ですが)には、
exe が NFS Share上にあるとこのような現象が出るとの情報がありますが、
今回のサーバでは(仮想OS上)ローカルディスクのため、別の原因と考えています。 -
自分はこんな感じでやってますが、特にトラブルになったことはありません。
//サーバー側 WSADATA m_SockData; m_SockData.wVersion = 0x0000; ::WSAStartup( MAKEWORD( 2, 2), &m_SockData); SOCKET m_SO_Listen = ::socket( AF_INET, SOCK_STREAM, IPPROTO_IP); // サーバーリスン TCP/IP // この後アドレスとポートを指定して // ::bind( m_SO_Listen,,) // ::listen() // アクセプト待ちwhile()ループ(スレッド化してます)