1

解決策を見つけることができるかどうかを確認するために、すでにいくつかのグーグルを実行しましたが、これまでのところ、役立つものは何も見つかりませんでした. 私の問題は、タイトルが示すとおりです。レジストリ値を変更して、指定したユーザーとしてリモート マシンにログオンしようとしましたが、デバッグ モードでは正常に動作しますが、解放されません (レジストリ値は同じままです)。管理者として Windows にログインしており、WMI の管理者資格情報も使用しています。どちらの場合も戻り値は "0" で、エラーがないことを意味します。もう 1 つ注意すべき点は、WMI を使用する他のすべての機能がデバッグ バージョンとリリース バージョンの両方で正常に動作することです (つまり、WMI クエリ、WMI のシャットダウン/再起動/ログオフ)。モード。これが私のコードです:

    public static bool LogOnAsViaWMI(string computerName, string username, string password, string logonUsername, string logonPW)
    {
        try
        {
            // Set connection options
            ConnectionOptions options = new ConnectionOptions();
            options.EnablePrivileges = true;
            options.Username = username;
            options.Password = password;

            // Connect to machine
            ManagementScope scope = new ManagementScope("\\\\" + computerName + "\\root\\CIMV2", options);
            scope.Connect();

            // Set management class
            ManagementPath managementPath = new ManagementPath("StdRegProv");
            ManagementClass mc = new ManagementClass(scope, managementPath, null);

            // Set registry values
            if (!SetRegKeyValue(mc, "AutoAdminLogon", "1") ||
                !SetRegKeyValue(mc, "ForceAutoLogon", "1") ||
                !SetRegKeyValue(mc, "DefaultUserName", logonUsername) ||
                !SetRegKeyValue(mc, "DefaultPassword", logonPW) ||
                !SetRegKeyValue(mc, "DefaultDomainName", "MyDomainName"))
            {
                MessageBox.Show("Failed to set Windows logon registry values");
                return false;
            }

            // Log off to log in as new default
            LogOff(computerName, username, password);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        return true;
    }

    private static bool SetRegKeyValue(ManagementClass mc, string valueName, string value)
    {
        // Set values
        ManagementBaseObject inParams = mc.GetMethodParameters("SetStringValue");
        inParams["hDefKey"] = HKEY_LOCAL_MACHINE;
        inParams["sSubKeyName"] = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon";
        inParams["sValueName"] = valueName;
        inParams["sValue"] = value;

        // Invoke inParams
        ManagementBaseObject outParams = mc.InvokeMethod("SetStringValue", inParams, null);
        if (outParams["returnValue"].ToString() != "0")
            return false;

        return true;
    }
4

0 に答える 0