Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Проблема с WMI

126  
  Аффтар ЧТД06.08.09 09:25
06.08.09 09:25 
Последний раз изменено 06.08.09 09:30 (Аффтар)
Я работаю не программистом, это как хобби, так что не ругаться. Пробую тут первый раз.
Нарисовал себе с VB.NET 2008 Express небольшой тул для наших техников для IP конфигурации новых компьютеров на Embedded XP.
Всё работает, могу IP конфиг посадить, имя и рабочую группу переименовать, службы стартовать и останавливать, деактивировать или активировать.
Единственная проблема - если я сажу TcpipNetbios на деактивирован (2), и это происходит без проблем (по MS описанию UInt32 0 - NetBIOS über DHCP aktivieren, 1 - NetBIOS aktivieren, 2 - NetBIOS deaktivieren), то потом не могу его посадить на 0.
WINS Pry и Sec садятся, а вот NetBIOS не переключается на 0. MsgBox показывает, что параметры передаются правильно.
Коды конвертировал с одного проекта из C# и добавил туда весь WINS.

Public Shared Sub SetIP(ByVal nicName As String, ByVal IpAddresses As String, ByVal SubnetMask As String, ByVal Gateway As String, ByVal DnsSearchOrder As String, _
ByVal PryWINS As String, ByVal SecWINS As String, ByVal NBActive As UInt32)
Dim mc As New ManagementClass("Win32_NetworkAdapterConfiguration")
Dim moc As ManagementObjectCollection = mc.GetInstances()
For Each mo As ManagementObject In moc
If DirectCast(mo("IPEnabled"), Boolean) Then
If mo("Caption").Equals(nicName) Then
Dim newIP As ManagementBaseObject = mo.GetMethodParameters("EnableStatic")
Dim newGate As ManagementBaseObject = mo.GetMethodParameters("SetGateways")
Dim newDNS As ManagementBaseObject = mo.GetMethodParameters("SetDNSServerSearchOrder")
Dim newWINS As ManagementBaseObject = mo.GetMethodParameters("SetWINSServer")
Dim newNBActive As ManagementBaseObject = mo.GetMethodParameters("SetTcpipNetbios")
newGate("DefaultIPGateway") = New String() {Gateway}
newGate("GatewayCostMetric") = New Integer() {1}
newIP("IPAddress") = IpAddresses.Split(","c)
newIP("SubnetMask") = New String() {SubnetMask}
newDNS("DNSServerSearchOrder") = DnsSearchOrder.Split(","c)
'MsgBox(PryWINS & " " & SecWINS & " " & NBActive.ToString)
newNBActive("TcpipNetbiosOptions") = NBActive
newWINS.SetPropertyValue("WINSPrimaryServer", PryWINS)
newWINS.SetPropertyValue("WINSSecondaryServer", SecWINS)
Dim setNBActive As ManagementBaseObject = mo.InvokeMethod("SetTcpipNetbios", newNBActive, Nothing)
Dim setIP As ManagementBaseObject = mo.InvokeMethod("EnableStatic", newIP, Nothing)
Dim setGateways As ManagementBaseObject = mo.InvokeMethod("SetGateways", newGate, Nothing)
Dim setDNS As ManagementBaseObject = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, Nothing)
Dim setWINS As ManagementBaseObject = mo.InvokeMethod("SetWINSServer", newWINS, Nothing)
MsgBox(setNBActive.ToString)
Exit For
End If
End If
Next
End Sub


На C# было бы (из конвертора):


public static void SetIP(string nicName, string IpAddresses, string SubnetMask, string Gateway, string DnsSearchOrder, string PryWINS, string SecWINS, UInt32 NBActive)
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc) {
if ((bool)mo("IPEnabled")) {
if (mo("Caption").Equals(nicName)) {
ManagementBaseObject newIP = mo.GetMethodParameters("EnableStatic");
ManagementBaseObject newGate = mo.GetMethodParameters("SetGateways");
ManagementBaseObject newDNS = mo.GetMethodParameters("SetDNSServerSearchOrder");
ManagementBaseObject newWINS = mo.GetMethodParameters("SetWINSServer");
ManagementBaseObject newNBActive = mo.GetMethodParameters("SetTcpipNetbios");
newGate("DefaultIPGateway") = new string[] { Gateway };
newGate("GatewayCostMetric") = new int[] { 1 };
newIP("IPAddress") = IpAddresses.Split(',');
newIP("SubnetMask") = new string[] { SubnetMask };
newDNS("DNSServerSearchOrder") = DnsSearchOrder.Split(',');
newNBActive("TcpipNetbiosOptions") = NBActive;
newWINS.SetPropertyValue("WINSPrimaryServer", PryWINS);
newWINS.SetPropertyValue("WINSSecondaryServer", SecWINS);
ManagementBaseObject setNBActive = mo.InvokeMethod("SetTcpipNetbios", newNBActive, null);
ManagementBaseObject setIP = mo.InvokeMethod("EnableStatic", newIP, null);
ManagementBaseObject setGateways = mo.InvokeMethod("SetGateways", newGate, null);
ManagementBaseObject setDNS = mo.InvokeMethod("SetDNSServerSearchOrder", newDNS, null);
ManagementBaseObject setWINS = mo.InvokeMethod("SetWINSServer", newWINS, null);
MsgBox(setNBActive.ToString);
break; // TODO: might not be correct. Was : Exit For
}
}
}
}


Какие нибудь идеи? Не пойму, где проблема.

"Everybody Lies" (с)
#1 
  Аффтар ЧТД06.08.09 09:52
NEW 06.08.09 09:52 
в ответ Аффтар 06.08.09 09:25
ПС: Проверил, "SetTcpipNetbios" 1 могу тоже передать, то есть NetBIOS без DHCP активировать. Только 0 не идёт.
"Everybody Lies" (с)
#2 
NightWatch коренной житель06.08.09 18:04
NightWatch
NEW 06.08.09 18:04 
в ответ Аффтар 06.08.09 09:25
В ответ на:
MsgBox показывает, что параметры передаются правильно.
Лучше посмотри что покажет MessageBox.Show(setNBActive["returnValue"].ToString());
#3 
  Аффтар ЧТД06.08.09 19:40
NEW 06.08.09 19:40 
в ответ NightWatch 06.08.09 18:04, Последний раз изменено 06.08.09 19:43 (Аффтар)
Смотрел. Показывает только "System.Management.ManagementBaseObject"_ а как вывести результат так и не нашёл.
На http://msdn.microsoft.com/en-us/library/aa393601%28VS.85%29.aspx есть результаты, а вот как вывести их не знаю.
ПС: Ошибка. ReturnValue не проверял. Спасибо.
"Everybody Lies" (с)
#4 
  Аффтар ЧТД07.08.09 08:41
NEW 07.08.09 08:41 
в ответ Аффтар 06.08.09 19:40
Проверил. Результат "100" DHCP not enabled on adapter.
То есть при "0 - NetBIOS über DHCP aktivieren" нужно чтобы был сперва активирован DHCP.
Хотя, если пользоваться нормальной "виндовской" маской, то можно установить "NetBIOS über DHCP aktivieren" и тогда, когда IP статический. Там так и написано, что если DHCP активирован, то установки берутся с него, а если нет, то пользуется просто "Enable Netbios". Видать отдельно маска так запрограммирована, что оставляет первую установку, даже если DHCP не активирован. Теперь у меня всё нормально работает. Я у себя вместо трёх "radiobutton" по лени просто чекбокс влепил, но и так идёт. Если DHCP активирован передаю 0, если нет - 1. Ну а 2, если чекет.
Большое спасибо за подсказку, а то я не знал, как вывести результат.
"Everybody Lies" (с)
#5