我正在考虑开发一个应该在大多数时间以标准用户身份运行的应用程序,但对于某些操作,将需要提升管理访问权限.在将某些内容复制到受保护的文件夹时,用户的特性应该与Windows资源管理器中的一样.
现在问题是,如何在.NET中实现它?我知道只有整个进程或某些COM实例可以升级,而不是单个函数.但这正是我所需要的.我应该走哪条路?写两个可执行文件,一个带清单,另一个没有; 以编程方式运行第二次提升的相同进程; 使用一些COM的东西?然后我有添加的权限,但如何告诉其他进程该怎么办?使用.NET远程处理(已弃用/复杂?); 使用套接字/管道/什么来实现我自己的IPC事物?升级的任务可能需要在过程中间询问用户某些事情.它必须是可以取消的.
有很多东西告诉我UAC如何在内部工作或系统管理员如何配置它,但我没有找到任何可以解答这些基本问题的东西.
以下情况:
有Get-Content和Out-File -Encoding UTF8我有正确阅读它的问题.这是它之前编写的BOM(将其放入内容,破坏我的解析正则表达式)的绊脚石,不使用UTF-8编码甚至删除原始内容部分中的换行符.
我需要一个能够读取任何UTF-8编码文件的函数,忽略并删除BOM而不修改内容.我该怎么用?
更新
我添加了一个小测试脚本,显示我正在尝试做什么以及发生了什么.
# Read data if exists
$data = ""
$startRev = 1;
if (Test-Path test.txt)
{
$data = Get-Content -Path test.txt
if ($data -match "^[0-9-]{10} - r([0-9]+)")
{
$startRev = [int]$matches[1] + 1
}
}
Write-Host Next revision is $startRev
# Define example data to add
$startRev = $startRev + 10
$newMsgs = "2014-04-01 - r" + $startRev + "`r`n`r`n" + `
"Line 1`r`n" + ` …Run Code Online (Sandbox Code Playgroud) 我正在将 ASP.NET Core 应用程序从 Framework 2.2 升级到 3.1。它还使用实体框架核心。
在 Startup.ConfigureServices 方法中,有这样一段代码:
services.AddEntityFrameworkNpgsql()
.AddDbContext<MainDbContext>(options => options
.UseNpgsql(Configuration.GetConnectionString("MainDbContext")));
Run Code Online (Sandbox Code Playgroud)
.NET Core 2.2 一切正常。使用 .NET Core 3.1,我在每次应用程序启动时都会收到此警告:
在服务提供程序上调用了“AddEntityFramework*”,但在 DbContext 选项配置中未调用“UseInternalServiceProvider”。删除“AddEntityFramework*”调用,因为在大多数情况下它是不需要的,并且可能会导致与在同一服务提供商中注册的其他产品和服务发生冲突。
查找UseInternalServiceProvider方法,看起来应该在上调options用以传递主要服务提供者。不幸的是,此时服务提供者还不存在。它即将建成。
我不明白问题是什么以及这个警告想告诉我什么,但没能做到。我怎样才能让那个警告消失?网络还不知道这条消息。
为已知窗口句柄设置Windows 7任务栏按钮状态的最短代码是什么?
目标是编写一个控制台实用程序,用于从批处理脚本更改控制台窗口任务栏项的进度和状态(颜色).当脚本执行不同的任务时,其控制台窗口的任务栏项应表示当前状态.
我使用GetConsoleWindow()函数获取窗口句柄,但是它似乎需要加载COM和Shell API的东西,我不明白.我发现的一个例子是使用一个完整的GUI应用程序和MFC来演示API,但是大多数它对于我的小工具来说太复杂了,而且我不太了解它以便删除我不需要的东西.
该工具应该在Windows 7上使用VS2010(C++)进行编译,但也可以在早期的Windows版本上运行(如果某个功能不可用则不执行任何操作).
我收到 SQLite 错误消息“FOREIGN KEY 约束失败”。这是完整的错误信息(除了 SQL 查询的一部分),并没有帮助。(实际上,它与 Oracle 错误消息一样好(或坏)。)我需要知道约束的名称来调查我的程序中的问题。不幸的是,没有网络支持平台可以与 SQLite 社区讨论这个问题。有人知道如何从该 SQLite 库中获取有关错误的更多信息吗?
我专门为 .NET 使用 System.Data.SQLite 库,但错误消息直接来自核心,没有其他异常属性可以帮助我。
如何IApplicationEnvironment.ApplicationBasePath从代码中的任何位置从属性访问ASP.NET Core应用程序基本路径?我不是在Startup类中,而是在其他一些帮助器类中,我需要从那里找到当前应用程序的目录.还没有HttpContext,因为该方法将独立于计时器的请求进行调用.我可以询问依赖容器或其他信息吗?有没有其他方法来获取此信息?
我正在尝试创建一个WPF MarkupExtension类,它从我的文本翻译类提供翻译文本.翻译的东西效果很好,但需要使用文本键进行静态方法调用以返回翻译的文本.像这样:
ImportLabel.Text = Translator.Translate("import files");
// will be "Dateien importieren" in de or "Import files" in en
Run Code Online (Sandbox Code Playgroud)
它的特点是它接受计数值以提供更好的措辞.
ImportLabel.Text = Translator.Translate("import n files", FileCount);
// will be "Import 7 files" or "Import 1 file"
Run Code Online (Sandbox Code Playgroud)
另一个例子:如果事情还需要4分钟,那么它只需要一分钟即可.如果文本键"minutes"被定义为任何数字的"Minuten"而计数为1的"Minute",则以下方法调用将返回要使用的右词:
Translator.Translate("minutes", numberOfMinutes)
// will be "minute" if it's 1, and "minutes" for anything else
Run Code Online (Sandbox Code Playgroud)
现在在WPF应用程序中,有很多XAML代码,其中包含大量文字文本.为了能够翻译它们而不必坚持,我需要一个标记扩展,我可以传递我的文本键,并将在运行时返回翻译的文本.这部分相当容易.创建一个继承自MarkupExtension的类,添加一个接受文本键作为参数的构造函数,将其存储在私有字段中,并让其ProvideValue方法返回存储键的翻译文本.
我真正的问题是:如何使我的标记扩展接受计数值,使其受数据限制,并且当计数值发生变化时,翻译文本将相应地更新?
它应该像这样使用:
<TextBlock Text="{t:Translate 'import files', {Binding FileCount}}"/>
Run Code Online (Sandbox Code Playgroud)
每当FileCount的绑定值发生更改时,TextBlock都必须接收新的文本值以反映更改,并仍然提供良好的措辞.
我在那里找到了一个类似的解决方案:http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection. aspx但是,尽管我努力遵循它,但我无法理解它的作用或为什么它会起作用.似乎所有事情都发生在WPF中,提供的代码只会将其推向正确的方向,但目前还不清楚如何.我不能让我适应它做任何有用的事情.
我不确定在运行时让翻译语言发生变化是否有用.我想我需要另一级别的绑定.为了保持低复杂性,我不打算在基本版本工作之前这样做.
目前没有代码可以告诉你.它只是处于一种可怕的状态,它唯一能做的就是抛出异常,或者不翻译任何东西.任何简单的例子都非常受欢迎(如果在这种情况下存在这样的事情).
这种语言真是奇怪.我正在尝试执行一个函数并将其结果值用作条件.这是我的代码:
function Get-Platform()
{
# Determine current Windows architecture (32/64 bit)
if ([System.Environment]::GetEnvironmentVariable("ProgramFiles(x86)") -ne $null)
{
echo "x64"
return "x64"
}
else
{
echo "x86"
return "x86"
}
}
if (Get-Platform -eq "x64")
{
echo "64 bit platform"
}
if (Get-Platform -eq "x86")
{
echo "32 bit platform"
}
Run Code Online (Sandbox Code Playgroud)
预期的输出是这样的:
x64
64 bit platform
Run Code Online (Sandbox Code Playgroud)
但实际输出是这样的:
64 bit platform
32 bit platform
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?怎么解决这个问题?我在网上找不到任何在if条件中使用函数的例子.在Powershell中,这有可能吗?我在Windows 7上没有特殊的设置,所以我有任何PS版本附带它.
breakPowerShell中应该有一个命令可以通过分配标签来退出嵌套循环.只是它不起作用.这是我的代码:
$timestampServers = @(
"http://timestamp.verisign.com/scripts/timstamp.dll",
"http://timestamp.comodoca.com/authenticode",
"http://timestamp.globalsign.com/scripts/timstamp.dll",
"http://www.startssl.com/timestamp"
)
:outer for ($retry = 2; $retry -gt 0; $retry--)
{
Write-Host retry $retry
foreach ($timestampServer in $timestampServers)
{
Write-Host timestampServer $timestampServer
& $signtoolBin sign /f $keyFile /p "$password" /t $timestampServer $file
if ($?)
{
Write-Host OK
break :outer
}
}
}
if ($retry -eq 0)
{
WaitError "Digitally signing failed"
exit 1
}
Run Code Online (Sandbox Code Playgroud)
它打印以下内容:
retry 2
timestampServer http://timestamp.verisign.com/scripts/timstamp.dll
Done Adding Additional Store
Successfully signed and timestamped: C:\myfile.dll
OK
retry 1 …Run Code Online (Sandbox Code Playgroud)