2011-10-04 13 views
8

Potrzebuję zmienić nazwę mojego komputera za pomocą aplikacji .net. Próbowałem ten kod:programowo zmieniaj nazwę komputera C# .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; 
     } 
    } 
} 

ale to nie działa.

i próbowałem ten jeden:

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; } 
} 

ale to również nie działa.

+4

"nie działa" oznacza .... błędy? – Shoban

+0

Czy trzeba ponownie uruchomić komputer, aby rzeczywiście odzwierciedlał zmiany? Czy dostaniesz jakieś błędy? –

+0

@Olia Zmiana nazwy komputera za pomocą aplikacji innych firm, jeśli to możliwe, spowoduje wiele problemów. – Mob

Odpowiedz

6

Próbowałem wszystkich sposobów znalazłem do zmiany komputera nazwa i nikt nie działa ..... to nie zmienia nazwy komputera ... Jedyny sposób, w jaki zadziałał, to kiedy wyszukałem niektóre wartości kluczy rejestru, to jest kod, czy to jest w porządku?

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; 
} 

i po ponownym uruchomieniu nazwa zmienia ....

3

Z dokumentacji MSDN SetComputerName ..

Ustawia nową nazwę NetBIOS dla komputera lokalnego. Nazwa jest przechowywana w rejestrze w rejestrze , a zmiana nazwy zaczyna obowiązywać, gdy użytkownik ponownie uruchomi komputer ponownie.

Czy próbowałeś ponownie uruchomić komputer?

+0

tak ... Zrobiłem restart –

1

Programmatically renaming a computer using C#

To długi artykuł i nie jestem pewien, co dokładnie będzie bezpośrednio związane, więc nie będę wkleić fragment

+3

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej (http: //meta.stackexchange.com/q/8259), aby uwzględnić istotne części odpowiedzi tutaj, i podać odsyłacz dla odniesienia. –

+0

Funkcja w tym artykule, która zmienia nazwę komputera, zgłasza ten wyjątek - Ścieżka sieciowa nie została znaleziona. (Wyjątek od HRESULT: 0x80070035) –

2

obiektom WMI ustawia nazwę komputera. Następnie rejestr jest używany do sprawdzenia, czy nazwa została ustawiona. Ponieważ System.Environment.MachineName nie jest od razu aktualizowany. Polecenie "nazwa hosta" w CMD.exe nadal wypisuje starą nazwę. W związku z tym konieczne jest ponowne uruchomienie komputera. Ale dzięki kontroli rejestru można sprawdzić, czy nazwa została ustawiona.

Mam nadzieję, że to pomoże.

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; 
} 
0

Bardzo trudno jest zaktualizować nazwę komputera przy użyciu jakichkolwiek zewnętrznych metod ze względu na ochronę systemu. Najlepszym sposobem jest użycie własnego narzędzia WMIC.exe do zmiany nazwy komputera. Wystarczy uruchomić plik wmic.exe z C# i przekazać polecenie zmiany nazwy jako argument.

>

public void SetMachineName(string newName) 
{ 

    // Create a new process 
    ProcessStartInfo process = new ProcessStartInfo(); 

    // set name of process to "WMIC.exe" 
    process.FileName = "WMIC.exe"; 

    // pass rename PC command as argument 
    process.Arguments = "computersystem where caption='" + System.Environment.MachineName + "' rename " + newName; 

    // Run the external process & wait for it to finish 
    using (Process proc = Process.Start(process)) 
    { 
     proc.WaitForExit(); 

     // print the status of command 
     Console.WriteLine("Exit code = " + proc.ExitCode); 
    } 
} 
+0

Jakie jest twoje pytanie? Co wydaje się być specyficznym problemem, który masz? – TVOHM

Powiązane problemy