サービス化でのネットワーク接続に関するエラーについて

このQ&Aのポイント
  • WindowsNTServiceProguramingを活用したサービス化でのネットワーク接続に関するエラーが発生しています。
  • 特に、サービスの中でネットワークの接続をしようとすると、ERROR_BAD_NET_NAMEのエラーが発生し、エラーが解決せずに先に進むことができません。
  • 質問者は環境がNT4.0とVC6.0であり、WNetAddConnection2関数を使用してネットワーク接続を試みています。しかし、この関数を使用してもエラーは解決されませんでした。
回答を見る
  • ベストアンサー

サービス化でのネットワーク接続

WindowsNTServiceProguramingを買いまして 仕事で活用しております。 例題2秒おきにログをかくサンプルにプログラムを挿入しました。 クライアントの時刻とサーバの時刻をファイルに書くプログラムです サービスの中で、ネットワークの接続をしようとすると ERROR_BAD_NET_NAMEのエラーがかえってきます。 サービスでなければ稼動するのですが エラーで先に進みません 下記のようなコーデングなのですが NETRESOURCE nr; char OutNetFile[]="\\\\server\\c$"; ZeroMemory( &nr, sizeof( nr ) ); nr.lpLocalName = (LPTSTR)NULL; nr.lpRemoteName = (LPTSTR)OutNetFile; DWORD dwret = WNetAddConnection2( &nr,(LPTSTR)"passwd",(LPTSTR)"userid",0); 環境NT4.0,VC6.0 お忙しい中だとはおもいますが回答、アドバイスをいただければ たいへんありがたいのですが。宜しくお願いします。

  • phoo
  • お礼率85% (107/125)

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

  • ベストアンサー
  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

> サービスでなければ稼動するのですが これがすべてです。 コマンドライン(?)から動かす際は、あなたの アカウントでログインしていますが、 サービスとして稼働している時は、 「誰のアカウント(権限)で稼働しているか?」 が大問題になります。 多分systemというアカウントで稼働している はずです。 また、c$という隠し共有は別名「管理共有」と 呼ばれており、接続するには「管理者権限」が 必要になります。

phoo
質問者

お礼

大変、参考になる、アドバイスありがとうございます

phoo
質問者

補足

できました。 サービス登録削除のプログラム、 処理(ネットワーク接続、メイン処理)を行うプログラムのexeを2ファイルに分けることで解決できました

関連するQ&A

  • VBとVC++2005との違いはあるの?

    こんばんわ、matsuhiraです。 毎度のことながら質問させてください。 TCHAR szBuff[ 32768 ]; DWORD dwRet; // セクション名だけの列挙 dwRet = GetPrivateProfileSectionNames( szBuff, sizeof(szBuff), TEXT("application.ini") ); これは以前質問した際のサンプルコードになります。 このszBuffなんですけど、VB6.0ですとエラーはないのですが、 VC++2005だとエラーになっちゃいます。 TCHARにはできません。とか言われちゃうけど何でエラー?って 理解できないんです。 こんなの簡単!っ人はいますか?

  • NTサービスプログラムについて

    現在、NTサービスのプログラミングを行っているのですが、SCMへ状態を通知するSetServiceStatus()で必ずエラーが発生し困っています。 原因をご存知の方はいらっしゃらないでしょうか? ///////////////////////////////////////////////// int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPTSTR lpszArgs,int nCmdShow) { // エントリテーブルの初期化 SERVICE_TABLE_ENTRY dispatchTable[] = { { "TEST SERVICE", (LPSERVICE_MAIN_FUNCTION)ServiceMain}, { NULL, NULL } }; // // レジストリにデータを格納する関数をコール     // // dispatchTableで設定したサービスを提供することをSCMに通知 StartServiceCtrlDispatcher(dispatchTable); } //////////////////////////////////////////////////////////////////////// SERVICE_STATUS_HANDLE sshStatusHandle; void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { static DWORD dwCheckPoint = 1; // 制御ハンドラの登録 sshStatusHandle = RegisterServiceCtrlHandler("TEST SERVICE",ServiceCtrl); ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ssStatus.dwServiceSpecificExitCode = 0; ssStatus.dwControlsAccepted = 0; ssStatus.dwCheckPoint = dwCheckPoint++; // SCMへ通知 SetServiceStatus( sshStatusHandle, &ssStatus); // サービススタート ServiceStart(dwArgc,lpszArgv ); // サービス停止をSCMに通知 return; }

  • WNetAddConnection2がエラーなぜ?

    Microsoft Visual C++ 6.0 で、パスワード入力の必要なネットワークリソースのログインを行うようにするため、 WNetAddConnection2() を使ってみました。様々なサンプルコードを参考にプログラムを書きましたが、エラー1219が返されます。 自分のコンピューター:"MyComputer1" ユーザー認証によりログインしたいネットワーク上のコンピューター名と共有名  コンピューター名 : "ServPC02"  共有名 : "ShareData"  ユーザー名 : "Admin"  パスワード : "pass" こんな感じでプログラムを書きました。 class CMyTest {   public:     void Open(); }; void CMyTest::Open() {   NETRESOURCE nr ;   ZeroMemory(&nr , sizeof(NETRESOURCE) );   nr.dwType = RESOURCETYPE_DISK ;   nr.lpLocalName = NULL ;   nr.lpRemoteName = _T("\\\\ServPC02\\ShareData") ;   nr.lpProvider = NULL ;   DWORD dwResult = WNetAddConnection2(&nr , _T("pass") , _T("admin") , 0) ; }  戻り値は、dwResult = 1219 です。  ここで、コンピューター名 "ServPC02"のIPアドレスを gethostbyname() 関数により取得し、 nr.lpRemoteName = _T("\\\\192.168.2.100\\ShareName") ; としてWNetAddConnection2() を実行すると成功します。戻り値は0になり、この共有リソースの中にあるフォルダを検出することが可能になります。  なぜこのような現象が起こるのでしょうか?  IPアドレスを取得してネットワークのユーザー認証を行わせる方法を取ればいいけれど、コンピューター名をそのまま設定するとエラーになる理由が知りたいです。  ファイアウォールの問題など、プログラミング以外の部分の問題でしょうか。  OSは、Windows Vista (32bit)です。

  • WNetAddConnection2で困っています

    お世話になります。 VC6.0のサービス内でのネットワーク接続関数:WNetAddConnection2で困っています。 パラメータ NETRESOURCE nr;の // ローカルドライブ名 nr.lpLocalName = ""; // 共有フォルダ名 nr.lpRemoteName = "\\\\saver\\c$"; がエラーになります 「2 番目の引数を 'char [6]' から 'const unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照)指示された型は関連がありません; 変換にはreinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。」 (unsign short *)のセット方法は下記のように直したのですが // 資源の種類 nr.dwType = RESOURCETYPE_DISK; // ローカルドライブ名 nr.lpLocalName = (unsigned short*)""; // 共有フォルダ名 nr.lpRemoteName = (unsigned short*)"\\\\saver\\c$"; // プロバイダー名 nr.lpProvider = NULL; ・・・ dwret = WNetAddConnection2( &nr,(const unsigned short *)"passdw",(const unsigned short *)"userid",0); コンパイルはとおったのですが 接続できません (unsign short *)のセット方法が悪いのか サービスでなければうまく動くのですが・・・。 サービスなのでデバックもよくできません アドバイス、回答、お願いします。

  • WriteFileで送信できたかの確認方法は?

    シリアルポートで非同期でバイナリを送信するプログラムを作成しています。 以下のソースでバイナリを送信したつもりなのですが、本当に送信できているのか分りません。 送信が完了したのか確認するにはどうしたいいでしょうか? よろしくお願いします。 COMのオープン、DCBの設定は恐らく問題ないので、 WriteFileの周辺を抜粋します。 OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; char wbuf[7] = {0x02,0x0C,0x01,0x00,0x31,0x15,0x1A}; DWORD wbyte; if(!WriteFile(hCom,wbuf,(DWORD)sizeof(wbuf),&wbyte,&old)){ if(ERROR_IO_PENDING == GetLastError()){ GetOverlappedResult(hCom,&old,&wbyte,TRUE); } else MessageBox("エラー"); }

  • VC6.0「WindowsNT Service Programming」について

    OKWebメンバー様 おせわになります。phooです WindowsNT4.0クライアント・サーバ上で動くVC6.0で サービスプログラムを開発しています。 端末のホスト名、端末の時刻、サーバの時刻をファイルに出力するのをサービス化するプログラムです VC6.0は初心者です。もちろんサービスプログラムも初めて作ります サービスプログラムの文献も探したのですがなかなかない状況で ソフトバンクの発行する本で 「WindowsNT Service Programming」 (Kevin Miller-著 豊田 孝-翻訳・監修) という本があると聞きました。 本屋にいったら現在、どこも売り切れ状態です。 ぜひ見てみたいと思っています。 手に入れる方法ありますか? また他の参考になる本、URL、豊田 孝さんのe-mailなど 教えてください。 宜しくお願いいたします。

  • Winsock Connnect タイムアウト について

    OS :WinXP SP3 言語:VC++ 2005 Winsock2の通信モジュールを開発中です。 connectのタイムアウト方法をネットで調べて下記の関数を 作成(完全引用)したのですが、上手くいきません。 WSAWaitForMultipleEventsでイベントが発生していない (接続先が存在しない)のですが処理が返ってきてしまいます。 何か間違っているのでしょうか?ご回答、宜しくお願い致します。 ----------------------------------------------------------------BOOL connect2 ( SOCKET aSock, char* dwAddr, int wPort, int nTimeout ) { int liRet, liErr, liRetflag = FALSE; unsigned long lulAddr = inet_addr ( dwAddr ); WSAEVENT hEvent; DWORD dwRet; WSANETWORKEVENTS Events; sockaddr_in Addr; // イベント作成 hEvent = WSACreateEvent(); if ( hEvent == WSA_INVALID_EVENT ) { return FALSE; } // イベント型に(自動的にノンブロッキングになる) liRet = WSAEventSelect( aSock, hEvent, FD_CONNECT ); if( liRet == SOCKET_ERROR ) { WSACloseEvent( hEvent ); return FALSE; } // 接続 ZeroMemory( &Addr, sizeof( Addr ) ); Addr.sin_family = AF_INET; Addr.sin_port = htons( ( unsigned short )wPort ); Addr.sin_addr.s_addr = lulAddr; if ( connect( aSock, ( struct sockaddr* )&Addr, sizeof( Addr ) ) == SOCKET_ERROR ) { liErr = WSAGetLastError(); // WSAEWOULDBLOCKの時はまだ接続されていないので続ける if ( liErr != WSAEWOULDBLOCK ) { goto END; } } *** ↓ここですぐ返ってきてしまい、WSA_WAIT_TIMEOUTにならない *** // イベント発生待機 dwRet = WSAWaitForMultipleEvents( 1, &hEvent, FALSE, 60000, FALSE ); // dwRetがWSA_WAIT_EVENT_0以外でエラー // dwRetがWSA_WAIT_TIMEOUTの時タイムアウト if ( dwRet != WSA_WAIT_EVENT_0 ) { goto END; } // どのイベントが発生したか liRet = WSAEnumNetworkEvents( aSock, hEvent, &Events ); if( liRet == SOCKET_ERROR ) goto END; // Events.iliErrorCode[FD_CONNECT_BIT]が0の場合成功 if( ( Events.lNetworkEvents & FD_CONNECT ) && Events.iErrorCode[FD_CONNECT_BIT] == 0 ) { liRetflag = TRUE; } END: // イベント型を終了 WSAEventSelect( aSock, NULL, 0 ); WSACloseEvent( hEvent ); // ブロッキングに戻す(必要なら) dwRet = 0; ioctlsocket( aSock, FIONBIO, &dwRet ); return liRetflag; } ----------------------------------------------------------------

  • Windows2000でのサービスの起動と、スタートアップ

    Windows2000サーバにOracleをインストールしています。 同サーバにVB6でDBをアクセスするプログラムを作成しています。 サーバを自動ログインするように設定して、スタートアップにVBで作成したプログラムを起動する様に競ってしました。 実際に起動した場合、エラーが発生して起動できません (Oracleのサービスが起動し終わるまでにVBのプログラムが起動している模様) WindowsNTの時はこのようなことがなかったのですが Windows2000にサーバを替えたら発生しました。 何か、エラーが発生せず、自動ログインをして、プログラムが自動に起動するできる方法を教えてください。 (サービス起動後、ログインする方法や、サービス起動後、プログラムを起動する方法等) よろしくお願いいたします。

  • SQL Server 2005 Service Pack 3 のセキュ

    SQL Server 2005 Service Pack 3 のセキュリティ更新プログラム (KB970892) アップデートしましたが上記更新プログラムがエラーになりインストールできません。 何度行ってもエラーになってしまいます。Microsoft SQL Server 2005 Express Edition Service Pack 3をインストールしてから試してみましたが、やはりエラーでインストールされません。 正常にインストールするにはどうしたらいいのでしょうか。

  • SQL Server 2005 Service Pack 3 のセキュ

    SQL Server 2005 Service Pack 3 のセキュリティ更新プログラム (KB970892) のインストールが、できません。 レジストリエディタから、resomeキーのDWORD値を1→0に書き換える方法もダメで SQLEXPPRESを、実行中に変える方法も、うまくいきませんでした。 失敗の内容を見ると、ロックされたファイルがあります。とありますが、解決方法を、教えて下さい。 OSは、Windows Vista です。