【发布时间】:2019-02-05 13:27:00
【问题描述】:
下面是我用来获取凭据的 C# 代码。成功了。
class ClassName
{
[DllImport("BinaryName.dll", EntryPoint = "GetCredentials")]
static extern int GetCredentials(StringBuilder sbUser, StringBuilder sbPassword, string sKey);
static bool MethodName()
{
int iSuccess = 0;
StringBuilder sUser = new StringBuilder(256);
StringBuilder sPwd = new StringBuilder(256);
iSuccess = GetCredentials(sUser, sPwd, "KeyValue");
}
}
下面是模仿上面c#代码获取凭证的powershell代码
$args1 = ""
$args2 = ""
$args3 = "KeyValue"
$GetCredentials = @'
[DllImport("C:\\Path\\BinaryName.dll", EntryPoint = "GetCredentials", ExactSpelling=false)]
public static extern int GetCredentials([out] [MarshalAs(UnmanagedType.LPStr)] out String $args1, [out] [MarshalAs(UnmanagedType.LPStr)] out String $args2, [In] String $args3);
'@
$typeFunc = Add-Type -MemberDefinition $GetCredentials -Name "GetCredentials" -PassThru -Namespace System.Runtime.InteropServices
$ret = $typeFunc::GetCredentials($args1, $args2, $args3)
收到以下错误消息。请帮帮我
Add-Type : c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(9) : Unexpected character '$'
c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(8) : [DllImport("C:\\Path\\BinaryName.dll", EntryPoint = "GetCredentials", ExactSpelling=false)]
c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(9) : >>> public static extern int GetCredentials([MarshalAs(UnmanagedType.LPWStr)]StringBuilder $args1, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder $args2,
[MarshalAs(UnmanagedType.LPWStr)]String $args3);
c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(10) :
At line:8 char:13
+ $typeFunc = Add-Type -MemberDefinition $GetCredentials -Name "GetCred ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
【问题讨论】:
-
获取凭证是什么意思?为什么不在 powershell 中完成整个事情。为什么要使用 C#
-
从错误消息看来,
$导致您的类型定义出现问题。如果你删除它会发生什么?类型定义中的代码应该是 C#,而不是 PowerShell,因此$不能用作变量指示符。在previous answer 我做类似的事情。 -
@boxdog
$在 C# 变量名中无效。我在这里同意 ArcSet,OP 应该只使用Get-Credential。我觉得这是一个 XY 问题。
标签: powershell