2013-08-29 3 views
0

Да, есть много статей, связанных с повышением разрешений при установке пакетов MSI. У меня есть поворот в вопросе, что я не могу найти хороший ответ. Если я вошел в систему как пользователь, и я запустил мой код повышения MSI (ниже), пакет устанавливает, но текущие действия пользователя выполняются на пользователе, с которым я поднял установщик.
Например, если MSI добавляет файл на рабочий стол CURRENT USER. Результат повышения (работает как «Joe Admin») - это файл, который помещается на рабочий стол Joe Admin - не в настоящее время зарегистрированный пользователь («Пользователь Sally»). У меня есть программное обеспечение, которое поднимается как Joe, но помещает файл на рабочий стол Sally, как если бы он установил его. -Я хотел бы написать свое. Это на машине Windows 7, UAC выключен.Повысьте установку MSI при разрешении действий пользователя

Ниже приведен код нерабочего кода. (Салли вошла в систему, Поднимите, когда Joe -File переходит на рабочий стол Joe's Desktop) (свойство LoadUserProfile было попыткой решить эту проблему - не работает).

Process watchThis = ImpersonateInstaller(@"c:\temp\Test.msi", "SuperJoePassword"); 
    watchThis.WaitForExit();  

    private static Process ImpersonateInstaller(string msiPath, string Password) 
    { 
     Domain d = Domain.GetCurrentDomain(); 
     Process process = new Process(); 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.LoadUserProfile = true; 
     process.StartInfo.FileName = @"C:\Windows\System32\msiexec.exe"; 
     process.StartInfo.Arguments = string.Format(@"/i {0} REBOOT=ReallySuppress /qb-", msiPath); 
     process.StartInfo.WorkingDirectory = Environment.GetEnvironmentVariable("WINDIR"); 
     process.StartInfo.UserName = "JoeAdmin"; 
     process.StartInfo.Password = new SecureString(); 
     process.StartInfo.Domain = d.ToString(); 
     foreach (char c in Password.ToCharArray()) 
     { 
      process.StartInfo.Password.AppendChar(c); 
     } 
     process.Start(); 
     return process; 
    } 

ответ

1

С возвышенного вызова процесса msiexec /jm foo.msi для выполнения рекламы. Это благословляет пакет. От стандартного вызова пользовательского процесса msiexec /I foo.msi REBOOT=R /qb, и это начнет установку как пользователь, но при необходимости легко поднимет. Стандартные действия и пользовательские действия без олицетворения будут выполняться как SYSTEM, а пользовательские действия с Impeornation будут выполняться как пользователь без привилегий, как было разработано.

+0

Спасибо. Итак, я звоню с/jm вместо/i? –

+0

Это двухэтапный процесс. Вы вызываете его один раз, используя/jm из повышенного процесса, а затем вы вызываете его снова, используя/i из процесса без повышения. Имеют смысл? –

+0

Не особенно :), но я собираюсь сделать снимок. –

0

С помощью Кристофера Пейнтера это кажется ответом (СПАСИБО ХРИСТОФЕР !!!) Я читал слова «рекламировать» раньше и всегда предполагал, что это как-то связано с «публикацией в GPO», поэтому я никогда не следовало. Кажется, я ошибаюсь. Вот трюк, если кто-то еще столкнется с этим.

Во-первых, рекламируйте с повышенными правами «благословить» msi для установки конечного пользователя. На моем взгляде Администратор говорит, уверен, что это MSI безопасно для Sally конечного пользователя установить:

msiexec.exe /jm install.msi 

Затем установите в качестве конечного пользователя, как если бы они админы:

msiexec.exe /i install.msi /your /typcial /installOption /switches /here 

Моего код (конечно, может быть лучше):

 Process advertise = advertiseMSI(@"c:\temp\test.msi", "JoeWhoHasAdminRights", "Joe'sSuperPassword"); 
     advertise.WaitForExit(); 
     Process install = installMSI(@"c:\temp\test.msi"); 
     install.WaitForExit(); 


    private static Process advertiseMSI(string msiPath, string userName, string Password) 
    { 
     Domain domain = Domain.GetCurrentDomain(); 
     Process process = new Process(); 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.FileName = @"C:\Windows\System32\msiexec.exe"; 
     process.StartInfo.Arguments = string.Format(@"/jm {0}", msiPath); 
     process.StartInfo.WorkingDirectory = Environment.GetEnvironmentVariable("WINDIR"); 
     process.StartInfo.UserName = userName; 
     process.StartInfo.Password = new SecureString(); 
     foreach (char c in Password.ToCharArray()) 
     { 
      process.StartInfo.Password.AppendChar(c); 
     } 
     process.StartInfo.Domain = domain.ToString();    
     process.Start(); 
     return process; 
    } 

    private static Process installMSI(string msiPath) 
    { 
     Process process = new Process(); 
     process.StartInfo.FileName = @"C:\Windows\System32\msiexec.exe"; 
     process.StartInfo.Arguments = string.Format(@"/i {0} REBOOT=ReallySuppress /qb-", msiPath); 
     process.StartInfo.WorkingDirectory = Environment.GetEnvironmentVariable("WINDIR"); 
     process.Start(); 
     return process; 
    } 
+0

Одна заметка ... обязательно сохраните соответствующие ACL в файле MSI. Если пользователь, не являющийся пользователем, может изменить рекламируемый MSI и установить/переустановить его, он может использовать его как вектор атаки для получения повышенных разрешений. –

+0

Ничего себе, ты хорошо помнишь, чтобы следить за этим! –

Смежные вопросы