DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WMIでのIP設定

環境/言語:[VisualStudio2008(VB) 、Net Framework 4、Windows8(x64)]
分類:[.NET]

以前にWMIを使用した固定IPの変更する処理を作成したのですが、今回Windows8の端末が導入され同処理では固定IPの変更ができなくなりました。
WMIでコンピュータ名やIPアドレスの取得は動くのでWMIが完全に動かない訳ではなさそうです。

また、Windows8の導入に合わせてCOM参照(Microsoft WMI Scripting V1.2 Library)からSystem.Managementの参照に変更しました。
それでもWindows7では動作するのですが、以下のソースでは、Windows8固定IPに変更する際に「2147749891」のエラーが戻ってきてしまいます。

Windows8で動作させるのに別の方法をとらなければならないのでしょうか?
ローカルのAdministrator権限はついているのですが、新たに権限等が追加する必要があるのでしょうか?


Public Function SetStaticIPAddress(ByVal sAdapter As String, _
ByRef sIP As String, _
ByRef sSubnet As String, _
ByRef sGateWay As String, _
ByVal sDNSDiv() As String, _
ByRef sErrMsg As String) As Boolean

Dim sQuery As String = String.Empty
Dim oSearcher As New ManagementObjectSearcher()
Dim oMoc As ManagementObjectCollection
Dim oMo As ManagementObject
Dim oScope As New ManagementScope

Dim oNewIp As ManagementBaseObject = Nothing
Dim oSetIp As ManagementBaseObject = Nothing

Dim oNewGate As ManagementBaseObject = Nothing
Dim oSetGate As ManagementBaseObject = Nothing

Dim oNewDns As ManagementBaseObject = Nothing
Dim oSetDns As ManagementBaseObject = Nothing

Dim lRetIp As Long = Nothing
Dim lRetGate As Long = Nothing
Dim lRetDns As Long = Nothing

Try

oScope = New ManagementScope("\\localhost\root\cimv2")
oScope.Connect()
If oScope.IsConnected <> True Then
Exit Try
End If

sQuery = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = true and Description Like '%" & sAdapter & "%'"
oSearcher = New ManagementObjectSearcher(sQuery)
oMoc = oSearcher.Get

If oMoc.Count <> 0 Then
For Each oMo In oMoc
oNewIp = oMo.GetMethodParameters("EnableStatic")
oNewIp("IPAddress") = New String() {sIP}
oNewIp("SubnetMask") = New String() {sSubnet}

oSetIp = oMo.InvokeMethod("EnableStatic", oNewIp, Nothing)
'結果
lRetIp = Convert.ToInt64(oSetIp.Properties("ReturnValue").Value) ←ここで「2147749891」のエラー番号が返ってきます。

oNewGate = oMo.GetMethodParameters("SetGateways")
oNewGate("DefaultIPGateway") = New String() {sGateWay}
oNewGate("GatewayCostMetric") = New Integer() {1}

oSetGate = oMo.InvokeMethod("SetGateways", oNewGate, Nothing)
'結果
lRetGate = Convert.ToInt64(oSetGate.Properties("ReturnValue").Value)

oNewDns = oMo.GetMethodParameters("SetDNSServerSearchOrder")
oNewDns("DNSServerSearchOrder") = sDNSDiv

oSetDns = oMo.InvokeMethod("SetDNSServerSearchOrder", oNewDns, Nothing)
'結果
lRetDns = Convert.ToInt64(oSetDns.Properties("ReturnValue").Value)


Next
Else
Exit Try
End If


Return True
Catch exErr As Exception
sErrMsg = exErr.Message
Return False
End Try
End Function
No31423 の投稿はマルチポストです。ただしマルチポストされた投稿は、元記事の投稿者とは別人が嫌がらせで行なった可能性が高いです。もしそうであれば、すぐに返信でお知らせください。

●マルチポストされている場所
http://bbs.wankuma.com/index.cgi?mode=al2&namber=66127

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

●書き込みのルールについて
http://dobon.net/vb/bbs/index.html
■No31455に返信((報告)さんの記事)
> No31423 の投稿はマルチポストです。ただしマルチポストされた投稿は、元記事の投稿者とは別人が嫌がらせで行なった可能性が高いです。もしそうであれば、すぐに返信でお知らせください。
>
> ●マルチポストされている場所
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=66127
>

私自身はマルチポストを行っておりません。

また、質問者がこんなことを言うのは失礼かもしれませんが、ドメイン拒否の影響かこちらの掲示板はコメントが付きにくくなっているのかもしれません。

今回、投稿してからしばらく期間がありましたので、一旦コメントがつくのを待ちつつ処理を試しましたが、Windows8の場合は、NETSHコマンド使う方式で何とか変更するように方針を変更しました。
正直、WMIでの対応のコメントがつくまで「解決済み」はもうしばらくしばらく待とうと思っております。
  • 題名: Re[1]: WMIでのIP設定
  • 著者: Ha
  • 日時: 2013/04/08 20:43:12
  • ID: 31461
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示

わんくまさんのとこで魔界の仮面弁士様がコメントしていただいておりますが、最初にClickOnceアプリケーションという前置きを書き忘れておりました。

ClickOnceアプリケーションでの社内配布を行っているので、右クリック管理者として実行や
requestedExecutionLevelをrequireAdministratorに変更することができません。

とりあえず、NETSHコマンドでの対応も権限不足のため設定されませんでしたが、
「RUNAS」を付けることによって解決しました。

以下がNETSHコマンドでの暫定対応です。

Public Function SetNetshStaticIp(ByVal sAdapter As String, _
ByRef sIP As String, _
ByRef sSubnet As String, _
ByRef sGateWay As String, _
ByRef sDns() As String, _
ByRef iConnectType As Integer, _
ByRef sErrMsg As String) As Boolean

Dim sResults As String = String.Empty
Dim oPsi As New System.Diagnostics.ProcessStartInfo()

Dim sCommand As String = String.Empty

Try
'ComSpecのパスを取得する
oPsi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
oPsi.UseShellExecute = True
oPsi.CreateNoWindow = True 'ウィンドウを表示しないようにする(True)
oPsi.Verb = "runas"

'コマンドラインを指定("/c"は実行後閉じるために必要)
sCommand = "/c netsh interface ip set address name=""イーサネット"" " & _
" static addr=" & sIP & _
" mask=" & sSubnet & _
" gateway=" & sGateWay & " gwmetric=1"


oPsi.Arguments = sCommand

'起動
Dim oProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start(oPsi)

oProcess.WaitForExit()

Return True
Catch exErr As Exception
Return False
End Try


End Function


継続でWMIでの対応方法がわかるようでしたらよろしくお願いいたします。
■No31460に返信(Haさんの記事)

管理人の「どぼん!」です。

> また、質問者がこんなことを言うのは失礼かもしれませんが、ドメイン拒否の影響かこちらの掲示板はコメントが付きにくくなっているのかもしれません。

返信がつきにくいとのご指摘についてですが、それが事実かどうかは分かりませんが、仮に事実だとしても、その原因は単純に閲覧者が少ないか、この掲示板のルールがちょっと厳しめだからではないでしょうか。

ドメイン拒否についてですが、今のところは、過去に問題のあったIP(ほとんどがスパム投稿です)と、dnsblに登録されているIP(ほとんどが匿名プロキシです)だけですので、この影響で返信がつきにくいとは私には思えません。

この掲示板に対するご意見やご要望などは大歓迎ですので、もしございましたら、「お気楽掲示板」や「DOBON.NETへの提案」などにご投稿ください。よろしくお願いいたします。

お気楽掲示板
http://dobon.net/cgi-bin/kirakubbs/cbbs.cgi

DOBON.NETへの提案
http://wiki.dobon.net/index.php?%BC%AB%CD%B3%B6%E8%2FDOBON.NET%A4%D8%A4%CE%C4%F3%B0%C6
> 返信がつきにくいとのご指摘についてですが、それが事実かどうかは分かりませんが、仮に事実だとしても、その原因は単純に閲覧者が少ないか、この掲示板のルールがちょっと厳しめだからではないでしょうか。

たしかにその通りかもしれません。

> ドメイン拒否についてですが、今のところは、過去に問題のあったIP(ほとんどがスパム投稿です)と、dnsblに登録されているIP(ほとんどが匿名プロキシです)だけですので、この影響で返信がつきにくいとは私には思えません。

私の会社が今でも「ERROR-ホスト名が取得できません」と投稿使用とするとでるので拒否の影響が起きているものと思い、他の方も同様に拒否対象になっているのでは?と思いこんでおりました。
問題のあったIPとは考えにくいので他の理由があるのかもしれませんが。。。

DOBON.NET | プログラミング道 | プログラミング掲示板