小编Mik*_*ike的帖子

PowerShell和Server Manager模块的跨平台系统库参考

我正在编写的程序正在使用System.Management.Automation库来使用那里定义的powershell类和接口.这些库有两个版本:1.0.0.0和3.0.0.0.Windows Server 2008在其GAC版本1.0中,Windows Server 2012在其GAC中具有1.0和3.0.

为了能够在VS项目中使用此库,我必须引用它.现在这是一个决定,我应该参考哪一个?好吧,既然两台服务器的GAC都是1.0,那么引用1.0的服务器应该是安全的.不过,为了以防万一,我会在本地复制它,如果有一些罕见的(或常见的?)情况,它在GAC中不存在.

使用此库的示例代码:

using (PowerShell PS = PowerShell.Create())
{

    PS.AddScript("Import-Module ServerManager")
        .Invoke();
}
Run Code Online (Sandbox Code Playgroud)

Import-Module Servermanager命令导致powershell导入另一个dll , Microsoft.Windows.ServerManager. 问题开始了.

Windows Server 2008只有此库的版本6.1.0.0,其中Windows Server 2012的版本为6.3.0.0.我假定Automation的1.0〜6.1和3.0〜6.3版本相似度不巧合.

当我在Windows Server 2008上使用我的程序时,它工作正常,但当我尝试在Windows Server 2012上使用它时,此Automation 1.0程序集正在尝试加载2012年没有的ServerManager程序集版本6.1(!).2012年更愿意使用Automation assembly v3.0并加载ServerManager v6.3.

我假设有一些方法可以"告诉"程序加载程序集X,如果服务器版本Y和程序集A,如果服务器版本B,但它在哪里?我怎么能确定我不会遇到一些服务器,其中将有2.0或4.0或其他版本.

问题是我无法引用(本地复制)ServerManager程序集,因为(我认为),只要我能"告诉" 我的程序应该在哪里查找程序集,我无法告诉自动化程序集在何处查找其他组件.通过使用procmon进行分析,我可以看到它确切地知道在哪里寻找,因为它立即导航C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager到寻找ServerManager程序集.

我所知道的可能解决方案是:

  1. 我可以尝试动态加载程序集而不引用它们在视觉研究中使用Assembly.Load()dynamic对象使用,如有人建议的那样,我应该在火热的地狱中燃烧(我假设那个人提到它非常容易出错).

  2. 我可以将我需要的程序集添加到GAC,但这可能导致一些依赖地狱,因为Automation和ServerManager可能有很多其他依赖项,我现在才发现其中的两个.

我还有其他选择吗?

c# powershell .net-assembly visual-studio-2012

17
推荐指数
1
解决办法
272
查看次数

从Office内部更新ClickOnce VSTO AddIn不会更新AddIn

我在功能区上有一个按钮来检查AddIn(本身)更新

这是代码

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    UpdateCheckInfo info = null;

    if (ApplicationDeployment.IsNetworkDeployed)
    {
        ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
        var appId = new ApplicationIdentity(ad.UpdatedApplicationFullName);
        var unrestrictedPerms = new PermissionSet(PermissionState.Unrestricted);
        var appTrust = new ApplicationTrust(appId)
        {
            DefaultGrantSet = new PolicyStatement(unrestrictedPerms),
            IsApplicationTrustedToRun = true,
            Persist = true
        };

        ApplicationSecurityManager.UserApplicationTrusts.Add(appTrust);

        info = ad.CheckForDetailedUpdate();

        if (info.UpdateAvailable)
        {
            ad.Update();
            MessageBox.Show("DONE");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是我收到"完成"消息框但重新启动Excel后,插件实际上没有更新,我无法再次更新它,因为下次我点击相同的按钮时,ApplicationDeployment.IsNetworkDeployed返回false.

我怎样才能解决这个问题?

.net c# vsto add-in ms-office

8
推荐指数
1
解决办法
1254
查看次数

检索X509Certificate2对象的颁发者

我有一个从X509Store检索到的X509Certificate2对象。我想获取此证书的颁发者,但此对象提供的仅有的两个属性是X509Certificate2.IssuerX509Certificate2.IssuerName.Issuer因为它会还原基本上是颁发者名称的字符串,因此有点误导。

这两个属性最多都可以返回专有名称,但是DN不是唯一的,对不对?因此,我不想将X509Certificate2Collection.Find方法与X509FindType.FindByIssuerDistinguishedName标志一起使用。

如何获得证书的颁发者,并确保我拥有“正确的证书”。注意:我不必使用X509Certificate2对象。欢迎其他选择。

.net c# certificate x509certificate

4
推荐指数
1
解决办法
2873
查看次数

通过SOCKS代理发送UDP数据包

我正在构建一个简单的应用程序,它应该通过socks4/5 代理发送UDP 数据报包。我使用 UDP 方法,因此不必保持连接打开。

然而,这并不像我想象的那么容易。根据此架构,我得出结论,如果不先与代理服务器建立 TCP 连接,则无法通过代理发送 UDP 数据。 在此输入图像描述

尽管如此,我找不到在 CPP 中建立这种连接的任何合适的例子。我将不胜感激任何资源:)

c++ sockets proxy winsock socks

3
推荐指数
1
解决办法
1万
查看次数

将$ {}变量传递给awk而不会丢失它

我有以下字符串This is ${name} ${surname}.这个字符串是不可替代的

现在,我需要更换${name},并${surname}用自己的数据.我想使用sed/awk,但是当我输入时

string="This is ${name} ${surname}"
echo $string | awk '{... gsub() ...}'
Run Code Online (Sandbox Code Playgroud)

然后问题是,awk我只是This is因为已经echo解决了${},因为它是空的.

我不知道我是否可以使用类似的东西

awk <<EOF
This is ${name} ${surname}
EOF
Run Code Online (Sandbox Code Playgroud)

因为我需要把它包装成变量,因为bash是oneliner我不能那样打字

VAR=$(awk <<
This is ${name} ${surname}
EOF)
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间

variables bash awk sed echo

2
推荐指数
1
解决办法
75
查看次数

对占位符使用(void*)1而不是null是有好处的

我想知道使用(void *) 1而不是null在分配"空"值时是否存在任何差异/优势.(在C中)

c

0
推荐指数
1
解决办法
131
查看次数