none
Удаленное изменение прав в реестре XP RRS feed

  • Вопрос

  • Добрый день.

    Есть такая задача: Надо удаленно изменить разрешения на доступ к ветке реестра на группе компьютеров.

    Есть возможность запустить на каждом нужную программу с ключами от имени локального администратора, но вот вопрос - какую?

    В описании к коммандной строке regedit.exe я про разрешения ничего не нашел =(

    Какие ещё будут варианты?

    Спасибо!

Ответы

  • Посмотрите статью:

    http://support.microsoft.com/kb/245031/ru

    • Предложено в качестве ответа SpxnezzaR 22 мая 2010 г. 19:38
    • Помечено в качестве ответа Vinokurov YuriyModerator 27 мая 2010 г. 13:35
  • как то так.

    на клиентах запускается вот такой скрипт.

    # wget.ps1
    function Get-WebFile {
      param(
        $url = (Read-Host "The URL to download"),
        $fileName = $null,
        [switch]$Passthru,
        [switch]$quiet
      )

      trap {
        continue
      }

      $req = [System.Net.HttpWebRequest]::Create($url);
      $res = $req.GetResponse();

      if($fileName -and !(Split-Path $fileName)) {
        $fileName = Join-Path (Get-Location -PSProvider "FileSystem") $fileName
      }
      elseif((!$Passthru -and ($fileName -eq $null)) -or (($fileName -ne $null) -and (Test-Path -PathType "Container" $fileName)))
      {
        [string]$fileName = ([regex]'(?i)filename=(.*)$').Match( $res.Headers["Content-Disposition"] ).Groups[1].Value
        $fileName = $fileName.trim("\/""'")
        if(!$fileName) {
          $fileName = $res.ResponseUri.Segments[-1]
          $fileName = $fileName.trim("\/")
          if(!$fileName) {
            $fileName = Read-Host "Please provide a file name"
          }
          $fileName = $fileName.trim("\/")
          if(!([IO.FileInfo]$fileName).Extension) {
            $fileName = $fileName + "." + $res.ContentType.Split(";")[0].Split("/")[1]
          }
        }
      $fileName = Join-Path (Get-Location -PSProvider "FileSystem") $fileName
      }
      if($Passthru) {
        $encoding = [System.Text.Encoding]::GetEncoding( $res.CharacterSet )
        [string]$output = ""
      }

      if($res.StatusCode -eq 200) {
        [int]$goal = $res.ContentLength
        $reader = $res.GetResponseStream()
        if($fileName) {
          $writer = new-object System.IO.FileStream $fileName, "Create"
        }
        [byte[]]$buffer = new-object byte[] 4096
        [int]$total = [int]$count = 0
        do {
          $count = $reader.Read($buffer, 0, $buffer.Length);
          if($fileName) {
            $writer.Write($buffer, 0, $count);
          }
          if($Passthru){
            $output += $encoding.GetString($buffer,0,$count)
          } elseif(!$quiet) {
            $total += $count
            if($goal -gt 0) {
              Write-Progress "Downloading $url" "Saving $total of $goal" -id 0 -percentComplete (($total/$goal)*100)
            } else {
              Write-Progress "Downloading $url" "Saving $total bytes..." -id 0
            }
          }
        } while ($count -gt 0)

        $reader.Close()
        if($fileName) {
          $writer.Flush()
          $writer.Close()
        }
        if($Passthru){
          $output
        }
      } else {
        Write-Host "Error getting url - $url"
      }
      $res.Close();
      if($fileName) {
        Write-Host "Getting url - $url"
        ls $fileName
      }
    }

    # define file names
    $file1 = "C:\temp\test.cmd"
    $file2 = "C:\temp\test2.cmd"
    $file3 = "C:\temp\test3.cmd"
    $url1 = "http://SRV_URL/mgmt/test.cmd"
    $url2 = "http://SRV_URL/mgmt/test2.cmd"
    $url3 = "http://SRV_URL/mgmt/test3.cmd"

    # main
    Get-WebFile $url1 $file1
    & $file1
    Get-WebFile $url2 $file2
    & $file2
    Get-WebFile $url3 $file3
    & $file3


    blog.wadmin.ru

Все ответы

  • Посмотрите статью:

    http://support.microsoft.com/kb/245031/ru

    • Предложено в качестве ответа SpxnezzaR 22 мая 2010 г. 19:38
    • Помечено в качестве ответа Vinokurov YuriyModerator 27 мая 2010 г. 13:35
  • Вариант ещё один: если вдруг (вдруг!) у вас есть домен, то это делается на раз доменными политиками. А домен есть?

    • Предложено в качестве ответа zero55 22 мая 2010 г. 10:12
    Отвечающий
  • C:\Documents and Settings\myname>subinacl /help /keyreg
    SubInAcl version 5.2.3790.1180

    /KEYREG
    -------

    /keyreg registry_key

    manipulate registry keys
    - HKEY_CURRENT_USER\Software
    - HKEY_CURRENT_USER\Software\*Version
    - \\Srv\HKEY_LOCAL_MACHINE\KeyPath

     

    ??

  • Если ПК включены в домен то это выполняется при помощи GPO

    если нет то пишется ps-скрипт который выполняется по расписанию, функционал примерно такой

    1. скрипт забирает с веб-сервера файл задания

    2. выполняет его

    если есть необходимость то готов им поделиться.


    blog.wadmin.ru
    • Предложено в качестве ответа SpxnezzaR 22 мая 2010 г. 19:36
  • мне интересно, вы хотите процесс автоматизировать или вам важен сам факт сделать это удаленно?

    автоматизированно тут уже предложили - средствами GPO

    если нет домена, то можно воспользоваться ресурс-китом и удаленно сделать все что надо, как выше уже писали все написано тут http://support.microsoft.com/kb/245031/ru

    ну или в конце концов воспользоваться удаленным реестром. для подключения удаленно к реестру каждого компьютера и вручую выбирать права для веток.

  • Хочу именно автоматизировать. Т.к. на всех компьютерах запущен сетевой антивирус, готовый по комманде с сервера запустить любую программу (в т.ч. с нужными ключами). Домена нет. Задача - на большом количестве компьютеров изменить разрешения на одну и ту же ветку реестра.
  • как то так.

    на клиентах запускается вот такой скрипт.

    # wget.ps1
    function Get-WebFile {
      param(
        $url = (Read-Host "The URL to download"),
        $fileName = $null,
        [switch]$Passthru,
        [switch]$quiet
      )

      trap {
        continue
      }

      $req = [System.Net.HttpWebRequest]::Create($url);
      $res = $req.GetResponse();

      if($fileName -and !(Split-Path $fileName)) {
        $fileName = Join-Path (Get-Location -PSProvider "FileSystem") $fileName
      }
      elseif((!$Passthru -and ($fileName -eq $null)) -or (($fileName -ne $null) -and (Test-Path -PathType "Container" $fileName)))
      {
        [string]$fileName = ([regex]'(?i)filename=(.*)$').Match( $res.Headers["Content-Disposition"] ).Groups[1].Value
        $fileName = $fileName.trim("\/""'")
        if(!$fileName) {
          $fileName = $res.ResponseUri.Segments[-1]
          $fileName = $fileName.trim("\/")
          if(!$fileName) {
            $fileName = Read-Host "Please provide a file name"
          }
          $fileName = $fileName.trim("\/")
          if(!([IO.FileInfo]$fileName).Extension) {
            $fileName = $fileName + "." + $res.ContentType.Split(";")[0].Split("/")[1]
          }
        }
      $fileName = Join-Path (Get-Location -PSProvider "FileSystem") $fileName
      }
      if($Passthru) {
        $encoding = [System.Text.Encoding]::GetEncoding( $res.CharacterSet )
        [string]$output = ""
      }

      if($res.StatusCode -eq 200) {
        [int]$goal = $res.ContentLength
        $reader = $res.GetResponseStream()
        if($fileName) {
          $writer = new-object System.IO.FileStream $fileName, "Create"
        }
        [byte[]]$buffer = new-object byte[] 4096
        [int]$total = [int]$count = 0
        do {
          $count = $reader.Read($buffer, 0, $buffer.Length);
          if($fileName) {
            $writer.Write($buffer, 0, $count);
          }
          if($Passthru){
            $output += $encoding.GetString($buffer,0,$count)
          } elseif(!$quiet) {
            $total += $count
            if($goal -gt 0) {
              Write-Progress "Downloading $url" "Saving $total of $goal" -id 0 -percentComplete (($total/$goal)*100)
            } else {
              Write-Progress "Downloading $url" "Saving $total bytes..." -id 0
            }
          }
        } while ($count -gt 0)

        $reader.Close()
        if($fileName) {
          $writer.Flush()
          $writer.Close()
        }
        if($Passthru){
          $output
        }
      } else {
        Write-Host "Error getting url - $url"
      }
      $res.Close();
      if($fileName) {
        Write-Host "Getting url - $url"
        ls $fileName
      }
    }

    # define file names
    $file1 = "C:\temp\test.cmd"
    $file2 = "C:\temp\test2.cmd"
    $file3 = "C:\temp\test3.cmd"
    $url1 = "http://SRV_URL/mgmt/test.cmd"
    $url2 = "http://SRV_URL/mgmt/test2.cmd"
    $url3 = "http://SRV_URL/mgmt/test3.cmd"

    # main
    Get-WebFile $url1 $file1
    & $file1
    Get-WebFile $url2 $file2
    & $file2
    Get-WebFile $url3 $file3
    & $file3


    blog.wadmin.ru