各位大侠!小弟遇到一点问题,能否帮小弟指点一下???

zhoumin110 2006-06-21 12:46:52
不久前我用vb编了一个程序来修改计算机名,程序如下:
Private Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" _
(ByVal lpComputerName As String) As Long

Private 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
运行了过后,注册表中的计算机名的键值改了,但是“我的电脑”---“属性”----“网络表识”中的计算机名却没有改变,重新启动计算机过后也没用 。请高手帮小弟看看,到底怎么了。
...全文
187 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 2006-06-29
  • 打赏
  • 举报
回复
呵呵,,再回复一下,其实啊,第1种方法也不麻烦啊,你在代码里生成一个RENAME.REG,然后调用一下就可以了。
一般来说用DOS命令就好,不过现在的同志们似乎都放弃了DOS,不知道什么原因,其实命令行是非常强大的,很多事情我们需要借助它来实现,就象上面代码里面借助WMI,有时候我们借助COM,DOS命令行也是很好的工具
zhoumin110 2006-06-22
  • 打赏
  • 举报
回复
老大你的第二种方法的代码有点问题哦,而且代码有些罗嗦,不怎么实用。
清晨曦月 2006-06-22
  • 打赏
  • 举报
回复
呵呵,第二种,你可以改一下,

不知道你的代码哪里有问题,我以前一般都是在进行比较一般的软件开发,讨厌数据库一直没涉猎太深,API倒基本都学了,但是很少用他们操作计算机属性,最近学习WMI所以一般都在使用WMI回答问题.上面这部分代码我测试过了,好用的

第二部分修改的结果如下(注意测试前请添加对MICROSOFT WMI SCRIPTING 1.X LIBRARY的引用)
Option Explicit

Dim 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 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"是你要改成的计算机名
zhoumin110 2006-06-22
  • 打赏
  • 举报
回复
大虾!
能否告诉小弟,我哪个代码错在那儿,哪儿需要改进?
清晨曦月 2006-06-21
  • 打赏
  • 举报
回复
郁闷,还真给我留着啊,我的可用分怎么就不增加呢,明明得了那么多了。。。。

提供2种方法:
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 Explicit

Dim 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 Sub

Private 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 Sub

Private 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写了一个,很容易),写类似这些修改计算机设置的软件的时候,根本不用四处去找,手动修改后对比结果就可以了,然后想办法实现。自己动手丰衣足食。。。。
清晨曦月 2006-06-21
  • 打赏
  • 举报
回复
恩恩,这个我倒会。。没时间了要上班迟到了,晚上还没人答我就不客气喽

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧