【问题标题】:Execute Powershell Script in C# Issue在 C# 问题中执行 Powershell 脚本
【发布时间】:2018-02-22 12:22:41
【问题描述】:

VS (C#) 中的 Powershell 脚本有问题。

总结:我为 Microsoft System Center 的特定客户端操作构建了一个小工具。

以下完美运行:

if (MachPolBox.IsChecked ?? true)
{
    using (PowerShell PowerShellInstance = PowerShell.Create())
    {
        PowerShellInstance.AddScript("Invoke-WMIMethod -ComputerName " + ComputerBox.Text + " -Namespace root\\ccm -Class SMS_CLIENT -Name TriggerSchedule " + MachinePolicy);
        PowerShellInstance.Invoke();
        MessageBlock.Foreground = Brushes.White;
        MessageBlock.Text = "running...";

        if (PowerShellInstance.HadErrors)
        {
            MessageBlock.Foreground = Brushes.Red;
            MessageBlock.Text = "Fehler... Programm als Administrator ausgeführt? Computername richtig?";
        }
        else
        {
            MessageBlock.Foreground = Brushes.White;
            MessageBlock.Text = "Erfolgreich";
        }
    }
}

其中一项操作将触发对用户政策的评估。问题是:远程运行脚本不会触发客户端上登录用户的操作。

这是我在 PowerShell 中找到的解决方法:

$sid = ( get-wmiobject -query "SELECT UserSID FROM CCM_UserLogonEvents WHERE LogoffTime = NULL" -namespace "ROOT\ccm").UserSID.replace('-','_');
$sched=([wmi]"root\ccm\Policy\$sid\ActualConfig:CCM_Scheduler_ScheduledMessage.ScheduledMessageID='{00000000-0000-0000-0000-000000000026}'");
$sched.Triggers=@('SimpleInterval;Minutes=1;MaxRandomDelayMinutes=0');
$sched.Put()

现在我在解析脚本时遇到问题。当告诉 Powershell 直接运行脚本时,使用Invoke,它运行完美(本地)。但我不想让脚本保留在应用程序目录中。

所以我尝试像第一个一样运行脚本:

PowerShellInstance.AddScript("$sid = (get-wmiobject -query \"SELECT UserSID FROM CCM_UserLogonEvents WHERE LogoffTime = NULL\" -namespace \"ROOT\\ccm\").UserSID.replace('-','_'); $sched=([wmi]\"root\\ccm\\Policy\\$sid\\ActualConfig: CCM_Scheduler_ScheduledMessage.ScheduledMessageID = '{00000000-0000-0000-0000-000000000026}'\"); $sched.Triggers=@('SimpleInterval;Minutes=1;MaxRandomDelayMinutes=0'); $sched.Put()");

但它不会运行(可能是语法错误)。

我对 VS 和 C# 很陌生;可能你训练有素的眼睛看得更多。 :)

提前致谢,克里斯

PS:here is the tutorial that I used

【问题讨论】:

    标签: c# visual-studio powershell


    【解决方案1】:

    @wp78de:感谢您的回答。但仅此一项并不能解决问题。但是,逐字字符串对我有很大帮助。

    我现在已经做到了。现在我可以为当前登录的用户触发 UserPolicy。

    代码是:

    if (UserPolBox.IsChecked ?? true)
    {
        using (PowerShell PowerShellInstance = PowerShell.Create())
        {
            var com         = @"$sid = (Get-WmiObject -Computername '" + ComputerBox.Text + @"' -query ""SELECT UserSID FROM CCM_UserLogonEvents WHERE LogoffTime = NULL"" -namespace ""ROOT\ccm"").UserSID.replace('-','_');";
            var sched       = @"$sched = ([wmi]""\\" + ComputerBox.Text + @"\root\ccm\Policy\$sid\ActualConfig:CCM_Scheduler_ScheduledMessage.ScheduledMessageID='{00000000-0000-0000-0000-000000000026}'"");";
            var triggers    = @"$sched.Triggers=@('SimpleInterval;Minutes=1;MaxRandomDelayMinutes=0');";
            var put         = @"$sched.Put()";
    
            PowerShellInstance.AddScript(com + sched + triggers + put);
    
            PowerShellInstance.Streams.Error.Clear();
            PowerShellInstance.Streams.Warning.Clear();
            var result = PowerShellInstance.Invoke();
            MessageBox.Show(PowerShellInstance.Streams.Error.Count().ToString() + " error counts");
    
            foreach (var errorRecord in PowerShellInstance.Streams.Error)
            {
                MessageBox.Show(errorRecord.ToString() + "first - error");
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      尝试使用逐字字符串:

      PowerShellInstance.AddScript(@"$sid = ( get-wmiobject -query "SELECT UserSID FROM CCM_UserLogonEvents WHERE LogoffTime = NULL" -namespace "ROOT\ccm").UserSID.replace('-','_');
      $sched=([wmi]"root\ccm\Policy\$sid\ActualConfig:CCM_Scheduler_ScheduledMessage.ScheduledMessageID='{00000000-0000-0000-0000-000000000026}'");
      $sched.Triggers=@('SimpleInterval;Minutes=1;MaxRandomDelayMinutes=0');
      $sched.Put()");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 2018-11-09
        • 1970-01-01
        • 2014-04-06
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多