我有一个用C#编写的应用程序,它是通过InnoSetup安装的。
启用Windows 10 Defender的“ 受控文件夹访问”后,安装程序无法创建桌面图标(显示消息PersistFile::Save failed, code 0x80070002)-尽管以管理权限运行。
此外,已安装的应用程序(未以管理特权运行)无法写入用户的文件夹,例如Documents。
即使对于新文件或文件夹,也不会覆盖现有文件,这也会发生。对于勒索软件保护,我希望仅修改现有文件被认为是危险的。
我想到的第一个问题是:为什么我的申请被认为是有害的,因此被阻止了?
我已经进行了广泛的研究以获得答案,但是找不到任何有帮助的内容:
Mircosoft的Web资源描述了哪些应用程序被认为是有害的以及为什么找不到它-只是在这里猜测。
使用扩展验证证书(有助于抑制SmartScreen警告)对我的应用程序签名不会更改Windows Defender的行为。
我让Windows App认证套件分析安装程序-报告了一些警告和一个严重错误。我修复了该工具包抱怨的所有问题(关于/ SAFESEH的警告除外,这对于InnoSetup而言是不可能的),但是这并没有改变Windows Defender关于访问阻止的行为。
因此,我的提炼问题是:如何以有效方式绕过Windows Defender的设置和应用程序访问阻止?
为了提供对该问题的见解并为实验提供基础,我在C#中设置了一个小样本应用程序
使用Visual Studio生成解决方案,并使用InnoSetup打包生成,可以很容易地通过启用“ 受控文件夹访问”来重现行为。(确保查看README.md以获取有关构建步骤的描述!)
请检查示例项目。
c# delphi security windows-defender controlled-folder-access
目标
我正在寻找可以监控我的C#以防止故障,特别是崩溃的工具/框架.
背景资料
我有一个C#应用程序使用Chromium Embedded Framework来托管可以访问OS功能的Web应用程序.因此,应用程序是C#和本机C/C++代码的混合.此外,应用程序需要同时运行多个进程才能正常运行.
如果某些过程出现问题,则应用程序很容易失效.这可能是由于 - C/C++中的内存故障 - 内存不足 - 编程错误 - 等等.
a)了解野外发生的问题,以及b)能够解决问题,我想找一些崩溃记者,
到目前为止的调查
我找到了类似线程的StackOverflow
https://stackoverflow.com/questions/755847/crash-reporting-watchdog-for-when-my-application-locks-up-on-a-customers-machin
https://stackoverflow.com/questions/32502190/how-can-i-monitor-an-application-crash-from-a-separate-process
https://stackoverflow.com/questions/78048/best-way-to-detect-an-application-crash-and-restart-it?noredirect=1&lq=1
Run Code Online (Sandbox Code Playgroud)但这些似乎并没有帮助我.
如果有人有这种问题的经验并指出它的工具/框架,我会很高兴.
最好的问候,cd_
与Windows 10相比,在Windows 7/8 / 8.1上进行监视时,我的应用程序显示出非常不同且非常烦人的内存占用。我将其归结为字体使用情况:
与其花费50-70 MB来枚举已安装的字体及其属性(就像该应用程序在Windows 7/8 / 8.1上所做的那样),不如花费大约500 MB来完成同一工作,这大约是它的十倍。
在谈到所需的内存时,我总是指进程的虚拟大小。
知道为什么会这样吗?似乎有些缓存在Windows 10上很流行。有什么好的解决方法?目前,我计划将所有GDI +字体处理调用映射到GDI调用,因为这些不会显示这种奇怪的行为。
(我发现Windows 10上的.NET FontFamily内存泄漏,但是没有有用的答案。)
为了缩小范围,我创建了两个示例程序。您可以运行程序并自行比较进程的VirtualSize。
C#示例仅枚举所有已安装的字体并实例化一种字体,同时适当处理非托管对象:
int i = 0;
foreach (FontFamily fontfamily in FontFamily.Families)
{
i++;
try
{
Font f = new Font(fontfamily, (float) 8.0, FontStyle.Bold);
Console.WriteLine("Created Font #{0} {1} ", i, f.Name);
f.Dispose();
f = null;
}
catch (Exception ex)
{
Console.WriteLine("Exception while creating Font {0} {1}", fontfamily.Name, ex.ToString());
}
fontfamily.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
Delphi示例更加复杂,使某些.NET内部结构更加明显。此外,您可以使用它进行不同的测试,以更出色的方式测量内存消耗。
program FontTests01;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Classes,
Windows, …Run Code Online (Sandbox Code Playgroud) 我已将 Gradle 构建脚本转换为 Kotlin DSL。由于我从一个小型新项目开始,一切都按计划进行。当引用越来越多的依赖项时,我想将它们的版本号作为常量放入脚本中,特别是对于那些在多个地方使用的版本。
在我的 app/build.gradle.kts 中,我基本上有以下内容:
dependencies {
implementation("androidx.appcompat:appcompat:1.0.0")
...
}
Run Code Online (Sandbox Code Playgroud)
Android Studio 检查告诉我,我应该升级到 1.1.0。我把它改为
val appCompat = "1.0.0"
dependencies {
implementation("androidx.appcompat:appcompat:$appCompat")
...
}
Run Code Online (Sandbox Code Playgroud)
但现在我不再得到那个检查提示了。
我将我的 Kotlin 脚本与我在Sunflower 参考项目中找到的脚本进行了比较,发现它可以在那里工作。所以,我尝试定义额外值
extra.apply {
set("appCompat", "1.0.0")
}
implementation("androidx.appcompat:appcompat:${extra["appCompat"]}")
Run Code Online (Sandbox Code Playgroud)
但也没有得到检查提示。
在我看来,使用 Kotlin DSL 的检查似乎被破坏了。你同意吗?或者你有一个可行的设置吗?
c# ×3
delphi ×2
android ×1
c++ ×1
crash-dumps ×1
dependencies ×1
fonts ×1
gdi+ ×1
gradle ×1
kotlin ×1
security ×1
windows-10 ×1