11

.netアプリケーションを使用してコンピューターの名前を変更する必要があります。私はこのコードを試しました:

public static bool SetMachineName(string newName)
{
    MessageBox.Show(String.Format("Setting Machine Name to '{0}'...", newName));

    // Invoke WMI to populate the machine name
    using (ManagementObject wmiObject = new ManagementObject(new ManagementPath(String.Format("Win32_ComputerSystem.Name='{0}'",System.Environment.MachineName))))
    {
        ManagementBaseObject inputArgs = wmiObject.GetMethodParameters("Rename");
        inputArgs["Name"] = newName;

        // Set the name
        ManagementBaseObject outParams = wmiObject.InvokeMethod("Rename",inputArgs,null);

        uint ret = (uint)(outParams.Properties["ReturnValue"].Value);
        if (ret == 0)
        {
            //worked
            return true;
        }
        else
        {
            //didn't work
            return false;
        }
    }
}

しかし、それは機能しませんでした。

そして私はこれを試しました:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern bool SetComputerName(string lpComputerName);

public static bool SetMachineName(string newName)
{

    bool done = SetComputerName(newName);
    if (done)
    {
        { MessageBox.Show("Done"); return true; }
    }
    else
    { MessageBox.Show("Failed"); return false; }
}

しかし、それも機能しませんでした。

4

4 に答える 4

11

私はコンピュータ名を変更するために見つけたすべての方法を試しましたが、誰も機能しません.....コンピュータ名は変更されません...それが機能した唯一の方法は、いくつかのレジストリキー値を変更したときです。これはコード、そうしても大丈夫ですか?

public static bool SetMachineName(string newName)
{
    RegistryKey key = Registry.LocalMachine;

    string activeComputerName = "SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ActiveComputerName";
    RegistryKey activeCmpName = key.CreateSubKey(activeComputerName);
    activeCmpName.SetValue("ComputerName", newName);
    activeCmpName.Close();
    string computerName = "SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName";
    RegistryKey cmpName = key.CreateSubKey(computerName);
    cmpName.SetValue("ComputerName", newName);
    cmpName.Close();
    string _hostName = "SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\";
    RegistryKey hostName = key.CreateSubKey(_hostName);
    hostName.SetValue("Hostname",newName);
    hostName.SetValue("NV Hostname",newName);
    hostName.Close();
    return true;
}

再起動後、名前が変わります。

于 2011-10-05T12:31:10.733 に答える
3

WMIオブジェクトは、コンピューター名を設定します。次に、レジストリを使用して、名前が設定されているかどうかを確認します。System.Environment.MachineNameはすぐには更新されないためです。また、CMD.exeの「hostname」コマンドは引き続き古い名前を出力します。したがって、再起動が必要です。ただし、レジストリチェックを使用すると、名前が設定されているかどうかを確認できます。

お役に立てれば。

Boolean SetComputerName(String Name)  
{  
String RegLocComputerName = @"SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName";
try
{
    string compPath= "Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'";
    using (ManagementObject mo = new ManagementObject(new ManagementPath(compPath)))
    {
        ManagementBaseObject inputArgs = mo.GetMethodParameters("Rename");
        inputArgs["Name"] = Name;
        ManagementBaseObject output = mo.InvokeMethod("Rename", inputArgs, null);
        uint retValue = (uint)Convert.ChangeType(output.Properties["ReturnValue"].Value, typeof(uint));
        if (retValue != 0)
        {
            throw new Exception("Computer could not be changed due to unknown reason.");
        }
    }

    RegistryKey ComputerName = Registry.LocalMachine.OpenSubKey(RegLocComputerName);
    if (ComputerName == null)
    {
        throw new Exception("Registry location '" + RegLocComputerName + "' is not readable.");
    }
    if (((String)ComputerName.GetValue("ComputerName")) != Name)
    {
        throw new Exception("The computer name was set by WMI but was not updated in the registry location: '" + RegLocComputerName + "'");
    }
    ComputerName.Close();
    ComputerName.Dispose();
}
catch (Exception ex)
{
    return false;
}
return true;  
}
于 2012-09-17T07:52:27.883 に答える
2

SetComputerNameのMSDNドキュメントから..

ローカルコンピュータの新しいNetBIOS名を設定します。名前はレジストリに保存され、ユーザーが次にコンピュータを再起動したときに名前の変更が有効になります。

コンピューターを再起動してみましたか?

于 2011-10-04T10:48:01.077 に答える
0

C#を使用してプログラムでコンピューターの名前を変更する

これは長い記事であり、正確に何が直接関連するのかわからないため、スニペットを貼り付けません

于 2011-10-04T10:48:53.457 に答える