1
0
mirror of https://github.com/vbondarevsky/OneCleaner.git synced 2024-11-26 18:11:45 +02:00

1. Рефакторинг

2. Исправлена ошибка с удалением
3. Windows 8 и выше в тихом режиме удаления требуют прав администратора. Добавлено повышение прав до администратора.
This commit is contained in:
Vladimir Bondarevskiy 2017-05-18 14:32:06 +03:00
parent 0957bf9d7e
commit 0ef6e48ee8
15 changed files with 168 additions and 111 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>

View File

@ -2,7 +2,8 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:OneCleaner"
StartupUri="MainWindow.xaml">
StartupUri="MainWindow.xaml"
Startup="App_Startup" >
<Application.Resources>
</Application.Resources>

View File

@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;
using System.Windows;
namespace OneCleaner
@ -13,5 +11,41 @@ namespace OneCleaner
/// </summary>
public partial class App : Application
{
private bool IsRunAsAdministrator()
{
var windowsIdentity = WindowsIdentity.GetCurrent();
var windowsPrincipal = new WindowsPrincipal(windowsIdentity);
return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
}
private void App_Startup(object sender, StartupEventArgs e)
{
if (!IsRunAsAdministrator())
{
// It is not possible to launch a ClickOnce app as administrator directly, so instead we launch the
// app as administrator in a new process.
var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase)
{
// The following properties run the new process as administrator
UseShellExecute = true,
Verb = "runas"
};
// Start the new process
try
{
Process.Start(processInfo);
}
catch (Exception)
{
// The user did not allow the application to run as administrator
MessageBox.Show("Sorry, this application must be run as Administrator.");
}
// Shut down the current process
Application.Current.Shutdown();
}
}
}
}

View File

@ -1,11 +1,12 @@
<Window x:Class="OneCleaner.MainWindow"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:OneCleaner"
xmlns:Platform="clr-namespace:OneCleaner.Platform" x:Class="OneCleaner.MainWindow"
mc:Ignorable="d"
Title="OneCleaner" Height="350" Width="525" Loaded="Window_LoadedAsync" Icon="icon.png">
Title="OneCleaner" Height="350" Width="525" Loaded="Window_LoadedAsync" Icon="icon.ico">
<Window.Resources>
<!--local:StateToFontWeightsConverter x:Key="StateToFontWeightsConverter"/-->
<DataTemplate x:Key="myItem" DataType="local:InstalledVersionUI">
@ -47,7 +48,7 @@
<RowDefinition Height="35"/>
</Grid.RowDefinitions>
<TextBlock TextWrapping="Wrap" Text="Получение списка установленных версий..." HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" Foreground="#FF9C9C9C" Grid.Row="1"/>
<ListView x:Name="list" ItemTemplate="{StaticResource myItem}" PreviewKeyDown="list_PreviewKeyDown" Grid.Row="1"/>
<ListView x:Name="List" ItemTemplate="{StaticResource myItem}" PreviewKeyDown="List_PreviewKeyDown" Grid.Row="1"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="2" Margin="10,7,5,5">
<Button x:Name="ButtonCancel" Content="Отменить" Visibility="Collapsed" Click="ButtonCancel_Click" Margin="0,0,3,0"/>
<Button x:Name="ButtonUninstall" Content="Выполнить удаление" Click="ButtonUninstall_Click" Margin="3,0,0,0"/>

View File

@ -1,18 +1,12 @@
using OneCleaner.Platform;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace OneCleaner
@ -28,7 +22,7 @@ namespace OneCleaner
public MainWindow()
{
InitializeComponent();
list.ItemsSource = _installedVersions;
List.ItemsSource = _installedVersions;
#if DEBUG
this.Title = this.Title + " (DEBUG)";
@ -37,12 +31,12 @@ namespace OneCleaner
private async void Window_LoadedAsync(object sender, RoutedEventArgs e)
{
list.Visibility = Visibility.Hidden;
List.Visibility = Visibility.Hidden;
ButtonUninstall.IsEnabled = false;
await _installedVersions.GetVersions();
list.Visibility = Visibility.Visible;
List.Visibility = Visibility.Visible;
ButtonUninstall.IsEnabled = true;
}
@ -106,7 +100,7 @@ namespace OneCleaner
}
private void list_PreviewKeyDown(object sender, KeyEventArgs e)
private void List_PreviewKeyDown(object sender, KeyEventArgs e)
{
foreach (InstalledVersionUI item in ((ListBox)(sender)).SelectedItems)
{
@ -137,11 +131,7 @@ namespace OneCleaner
{
List<InstalledVersionUI> uninst = _installedVersions
.Where(item => item.IsChecked && item.State == State.Installed)
.Select(item =>
{
item.State = State.MarkedForUninstall;
return item;
})
.Select(item => { item.State = State.MarkedForUninstall; return item; })
.ToList();
SetWindowStateInProgress();

View File

@ -8,11 +8,32 @@
<OutputType>WinExe</OutputType>
<RootNamespace>OneCleaner</RootNamespace>
<AssemblyName>OneCleaner</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<TargetFrameworkProfile />
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>\\BONDAREVSKIY-V\Utilities\OneCleaner\</PublishUrl>
<Install>true</Install>
<InstallFrom>Unc</InstallFrom>
<UpdateEnabled>true</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ProductName>OneCleaner</ProductName>
<PublisherName>Vladimir Bondarevskiy</PublisherName>
<WebPage>publish.htm</WebPage>
<OpenBrowserOnPublish>false</OpenBrowserOnPublish>
<ApplicationRevision>10</ApplicationRevision>
<ApplicationVersion>1.0.1.%2a</ApplicationVersion>
<UseApplicationTrust>true</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -33,6 +54,29 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<StartupObject>
</StartupObject>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>564D3C1FF9AFEC58D9C42E12487B4FC0CE036C8B</ManifestCertificateThumbprint>
</PropertyGroup>
<PropertyGroup>
<ManifestKeyFile>OneCleaner_TemporaryKey.pfx</ManifestKeyFile>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>true</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>
<PropertyGroup />
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
@ -89,6 +133,7 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="OneCleaner_TemporaryKey.pfx" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
@ -98,14 +143,25 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Resource Include="delete.ico" />
<Resource Include="unchecked.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="checked.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="icon.png" />
<Resource Include="icon.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.5.2 %28x86 и x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OneCleaner.Platform
{

View File

@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
@ -125,17 +122,16 @@ namespace OneCleaner.Platform
var result = 0;
System.Threading.Thread.Sleep(5000);
#else
//var result = mngObject.InvokeMethod("Uninstall", args);
if(uninstallStr == null)
if (_uninstallStr == null)
{
return false;
}
var ProcessInfo = new System.Diagnostics.ProcessStartInfo("msiexec.exe", String.Format("/X{0} /quiet",uninstallStr));
ProcessInfo.CreateNoWindow = true;
ProcessInfo.UseShellExecute = true;
var ProcessInfo = new System.Diagnostics.ProcessStartInfo("msiexec.exe", String.Format("/x{0} /q", _uninstallStr))
{
CreateNoWindow = false,
UseShellExecute = true
};
var Process = System.Diagnostics.Process.Start(ProcessInfo);
Process.WaitForExit();
var result = Process.ExitCode;

View File

@ -1,9 +1,6 @@
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OneCleaner.Platform

View File

@ -1,6 +1,4 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
@ -8,11 +6,11 @@ using System.Windows;
// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
// связанные со сборкой.
[assembly: AssemblyTitle("OneCleaner")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyDescription("Средство для удаления неиспользуемых версий 1С:Предприятие 8")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OneCleaner")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyCopyright("Copyright © 2017 Vladimir Bondarevskiy")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -51,5 +49,5 @@ using System.Windows;
// Можно задать все значения или принять номер сборки и номер редакции по умолчанию.
// используя "*", как показано ниже:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.0.2.0")]
[assembly: AssemblyFileVersion("1.0.2.0")]

View File

@ -1,49 +1,44 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программным средством.
// Версия среды выполнения: 4.0.30319.42000
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильному поведению и будут утрачены, если
// код создан повторно.
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OneCleaner.Properties
{
namespace OneCleaner.Properties {
using System;
/// <summary>
/// Класс ресурсов со строгим типом для поиска локализованных строк и пр.
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс был автоматически создан при помощи StronglyTypedResourceBuilder
// класс с помощью таких средств, как ResGen или Visual Studio.
// Для добавления или удаления члена измените файл .ResX, а затем перезапустите ResGen
// с параметром /str или заново постройте свой VS-проект.
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
internal Resources() {
}
/// <summary>
/// Возврат кэшированного экземпляра ResourceManager, используемого этим классом.
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OneCleaner.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
@ -52,18 +47,15 @@ namespace OneCleaner.Properties
}
/// <summary>
/// Переопределяет свойство CurrentUICulture текущего потока для всех
/// подстановки ресурсов с помощью этого класса ресурсов со строгим типом.
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set
{
set {
resourceCulture = value;
}
}

View File

@ -1,28 +1,24 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace OneCleaner.Properties
{
namespace OneCleaner.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
public static Settings Default {
get {
return defaultInstance;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

BIN
OneCleaner/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB