不久前我用vb编了一个程序来修改计算机名,程序如下:
Private Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" _
(ByVal lpComputerName As String) As LongPrivate Sub Form_Load()
Dim sNewName As String
'Ask for a new computer name
sNewName = InputBox("Please enter a new computer name.")
'Set the new computer name
SetComputerName sNewName
MsgBox "Computername set to " + sNewName
End Sub
运行了过后,注册表中的计算机名的键值改了,但是“我的电脑”---“属性”----“网络表识”中的计算机名却没有改变,重新启动计算机过后也没用 。请高手帮小弟看看,到底怎么了。
Private Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" _
(ByVal lpComputerName As String) As LongPrivate Sub Form_Load()
Dim sNewName As String
'Ask for a new computer name
sNewName = InputBox("Please enter a new computer name.")
'Set the new computer name
SetComputerName sNewName
MsgBox "Computername set to " + sNewName
End Sub
运行了过后,注册表中的计算机名的键值改了,但是“我的电脑”---“属性”----“网络表识”中的计算机名却没有改变,重新启动计算机过后也没用 。请高手帮小弟看看,到底怎么了。
1、修改注册表
2、使用WMI第一种方法:(代码就不写了,大家都会,只写出应该更改哪些部分)"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName\ComputerName\ComputerName",cmpname,"REG_SZ"
"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName\ActiveComputerName\ComputerName",cmpname,"REG_SZ"
"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\NV Hostname",cmpname,"REG_SZ"
"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Hostname",cmpname,"REG_SZ"
"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Control\ComputerName\ComputerName\ComputerName",cmpname,"REG_SZ"
"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Services\Tcpip\Parameters\NV Hostname",cmpname,"REG_SZ"
"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Services\Tcpip\Parameters\Hostname",cmpname,"REG_SZ"
修改以上位置就可以了,cmpname代表新名字"REG_SZ"是值的类型
第二种办法:首先在工程中引用WMI(其实只更改名字代码很少的,但是按照我一贯的做法把这个类简单的使用方法介绍一下,所以代码相对多了一些,楼主自己改改就可以了),然后添加一个LISEVIEW名称默认,一个TEXTBOX,名称默认,一个CMDBUTTON,名称默认然后添加以下代码:(测试时在TEXT1中输入一个名称,然后点COMMAND1后,查看计算机名)
Option ExplicitDim objSWbemLocator As SWbemLocator
Dim objSWbemServices As SWbemServices
Dim objSWbemObjectSet As SWbemObjectSet
Dim objSWbemObject As SWbemObject
Dim strComputer As String, strNameSpace As String, strClass As String
Private Sub Command1_Click()
For Each objSWbemObject In objSWbemObjectSet
objSWbemObject.rename Text1.Text '使用RENAME方法更改计算机名
Next
End SubPrivate Sub Form_Load()
ListView1.ColumnHeaders.Clear
ListView1.ColumnHeaders.Add , , "计算机名", 1800
ListView1.ColumnHeaders.Add , , "域", 1800
ListView1.ColumnHeaders.Add , , "当前用户名", 2000 ListView1.View = lvwReport
ListView1.FullRowSelect = True
strComputer = "." '计算机名,.为本机
strNameSpace = "root\cimv2" '指定命名空间为root\cimv2
strClass = "Win32_ComputerSystem" '指定类为Win32_Service
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") '建立1个WBEM对象的引用指针
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, strNameSpace) '连接到指定计算机、命名空间的WMI,返回一个对 SWbemServices 对象的引用
RefreshList '刷新服务列表
End SubPrivate Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
TxtDescription.Text = ListView1.ListItems("a" & ListView1.SelectedItem.Index - 1).Tag
End Sub'刷新服务列表
Sub RefreshList()
'On Error Resume Next
Dim i As Long
ListView1.ListItems.Clear
Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass) '通过WQL查询,返回指定类的所有
For Each objSWbemObject In objSWbemObjectSet
ListView1.ListItems.Add , "a" & i, objSWbemObject.Name '将name称添加到ListView1第一列
ListView1.ListItems("a" & i).SubItems(1) = objSWbemObject.Domain '将Domain添加到ListView1第三列
ListView1.ListItems("a" & i).SubItems(2) = objSWbemObject.UserName '将UserName添加到ListView1第四列 If IsNull(objSWbemObject.Description) Then '添加说明
ListView1.ListItems("a" & i).Tag = "无"
ElseIf objSWbemObject.Description = "" Then
ListView1.ListItems("a" & i).Tag = "无"
Else
ListView1.ListItems("a" & i).Tag = objSWbemObject.Description
End If
i = i + 1
Next
Set ListView1.SelectedItem = ListView1.ListItems(1)
End Sub以上就是了,
需要注意的是,无论哪种办法,都需要重新启动计算机后完全生效,当然,提供一个解决办法
那就是用代码结束桌面进程,然后重新调用它,就可以立即是注册表的修改生效了(第2种其实也是修改了注册表,你可以用注册表监视软件监视并对比一下)最后提一个建议,装1个注册表和文件监视器(自己写也行,我用WMI写了一个,很容易),写类似这些修改计算机设置的软件的时候,根本不用四处去找,手动修改后对比结果就可以了,然后想办法实现。自己动手丰衣足食。
Option ExplicitDim objSWbemLocator As SWbemLocator
Dim objSWbemServices As SWbemServices
Dim objSWbemObjectSet As SWbemObjectSet
Dim objSWbemObject As SWbemObject
Dim strComputer As String, strNameSpace As String, strClass As StringPrivate Sub Form_Load()
strComputer = "." '计算机名,.为本机
strNameSpace = "root\cimv2" '指定命名空间为root\cimv2
strClass = "Win32_ComputerSystem" '指定类为Win32_Service
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") '建立1个WBEM对象的引用指针
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, strNameSpace) '连接
Set objSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass) For Each objSWbemObject In objSWbemObjectSet
objSWbemObject.rename "ISSOR" '使用RENAME方法更改计算机名
Next
End Sub代码中"ISSOR"是你要改成的计算机名
一般来说用DOS命令就好,不过现在的同志们似乎都放弃了DOS,不知道什么原因,其实命令行是非常强大的,很多事情我们需要借助它来实现,就象上面代码里面借助WMI,有时候我们借助COM,DOS命令行也是很好的工具