在C#中执行Powershell脚本问题
问题描述:
我在VS(C#)中的Powershell脚本有问题。在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}'");
[email protected]('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}'\"); [email protected]('SimpleInterval;Minutes=1;MaxRandomDelayMinutes=0'); $sched.Put()");
,但它不会运行(可能是语法错误)。
我对VS和C#很陌生;大概你训练有素的眼睛看到更多:)
在此先感谢,克里斯
答
尝试使用,而不是逐字字符串:
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}'");
[email protected]('SimpleInterval;Minutes=1;MaxRandomDelayMinutes=0');
$sched.Put()");
答
@ 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 = @"[email protected]('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");
}
}
}
好,太好了。可悲的是,你还不能投票。 – wp78de