none
Сменить Owner с помощью Powershell RRS feed

  • Вопрос

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

     Есть:

     Файл сервер на Windows 2012, на нем есть диск G:\ с папкой Profiles, в нем храняться роаминг пользователи.

     Профили называются по имени пользователя например G:\Profiles\Username  или G:\Profiles\Username.v2

    Задача:

    Сменить на всех папках Овнера на имя пользователя того кто ее акцесит, тоесть если папка MTokarev.V2 то и овнера сменить например с админа на MTokarev.V2

    Что сделал:

     
    $aclp1=Get-Acl .\*
    $aclp=$aclp1.path
    $usernames=$aclp.split("\") -notmatch "Profile" -notmatch "File" -notmatch "micro" -notmatch "V2"
    foreach ($user in $usernames){$acl=Get-Acl -Path .\$user".v2";$owner=[System.Security.Principal.NTAccount]$user;$acl.SetOwner($owner)}
    
    

    Получаю:

    Exception calling "SetOwner" with "1" argument(s): "Some or all identity references could not be translated."

    Такое ощущение что он не находит пользователя, хотя если я запушу ту же команду где укажу пользователя руками, все ок.

    Что скажите?


    Мой скромный Блог

    8 октября 2013 г. 10:53

Ответы

Все ответы

  • 1) Будет некорректно отработано и результат, будет меняться от версии PowerShell(v2 отработает, если только одна папка, 2 и более уже нет,v3 в выводе получится мусор).

    $aclp1=Get-Acl .\*
    $aclp
    =$aclp1.path

    2) $aclp.split("\") -notmatch "Profile" -notmatch "File" -notmatch "micro" -notmatch "V2"

    PS > "G:\Profiles\MTokarev.v2".split("\") -notmatch "Profile" -notmatch "File" -notmatch "micro" -notmatch "V2"
    G:

    Вывод тоже не совсем корректный.

    Попробовать для начала.Domain - Заменить на свое(скажем Contoros\)

    $dir = Get-ChildItem *.v2 | Where {$_.PsIsContainer}
    $dir | Foreach {
    	$user = "DOMAIN\" + $_.Name.Replace(".v2","")
    	$acl = $_.GetAccessControl()
    	$owner=[System.Security.Principal.NTAccount]$user
    	$acl.SetOwner($owner)
    	$acl | Set-Acl $_.FullName
    }


    • Изменено KazunEditor 8 октября 2013 г. 11:18
    8 октября 2013 г. 11:16
    Отвечающий
  • PS C:\Users\Administrator> $dir = Get-ChildItem G:\test\*.v2 | Where {$_.PsIsContainer}
    $dir | Foreach {
    	$user = "Contoso\" + $_.Name.Replace(".v2","")
    	$acl = $_.GetAccessControl()
    	$owner=[System.Security.Principal.NTAccount]$user
    	$acl.SetOwner($owner)
    	$acl | Set-Acl $_.FullName
    }
    Exception calling "SetOwner" with "1" argument(s): "Some or all identity references could not be 
    translated."
    At line:6 char:2
    +     $acl.SetOwner($owner)
    +     ~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IdentityNotMappedException

    Тоже самое

    Попробовал еще вот так, но к сожалению не получилось

    PS C:\Users\Administrator> $dir = Get-ChildItem G:\test\*.v2 | Where {$_.PsIsContainer}
    $dir | Foreach {
        $user = "Contoso\" + $_.Name.Replace(".v2","")
        $permission = $user,"FullControl","Allow"
        $accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission
        $acl.SetAccessRule($accessRule)
    }
    Exception calling "SetAccessRule" with "1" argument(s): "Some or all identity references could not be 
    translated."
    At line:6 char:5
    +     $acl.SetAccessRule($accessRule)
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IdentityNotMappedException
     
    Exception calling "SetAccessRule" with "1" argument(s): "Some or all identity references could not be 
    translated."
    At line:6 char:5
    +     $acl.SetAccessRule($accessRule)
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : IdentityNotMappedException
    


    Мой скромный Блог


    8 октября 2013 г. 11:36
  • Немного пределал:

    import-module activedirectory
    
    $dir = Get-ChildItem F:\test\*.v2 | Where {$_.PsIsContainer}
    $dir | Foreach {
    	$user = $_.Name.Replace(".V2","")
        $aduser=Get-ADUser $user
    	$acl = Get-Acl -Path ('F:\test\'+$_.Name) 
    	$owner=[System.Security.Principal.NTAccount]$aduser.samaccountname
    	$acl.SetOwner($owner)
        $acl | Set-Acl $_.FullName
    }
    
    
    
    
    
    Set-Acl : The security identifier is not allowed to be the owner of this object.
    At line:8 char:12
    +     $acl | Set-Acl $_.FullName
    +            ~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (F:\test\HUser.V2:String) [Set-Acl], InvalidOperation 
       Exception
        + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.SetAclCo 
       mmand


    Мой скромный Блог

    8 октября 2013 г. 13:27
  • Попробуйте включить явно привилегию SeBackupPrivilege,используя модуль PSCX.

    ipmo pscx
    $p = get-privilege
    $p.Enable("sebackupprivilege")
    Set-Privilege $p

    • Помечено в качестве ответа Mikhail Tokaryev 11 октября 2013 г. 5:41
    8 октября 2013 г. 20:01
    Отвечающий
  • Да, наверное придеться именно его и использовать, столько всего с этими командлетами *-ACL.

    буду пробовать в пятницу, о результате напишу обязательно.

    Спасибо огромное за советы!


    Мой скромный Блог

    8 октября 2013 г. 20:12
  • Попробовал, но не получилось.

    Только вот после этого пошло:

    ipmo pscx
    $p = get-privilege
    $p.Enable("SeRestorePrivilege")
    Set-Privilege $p

    Огромное спасибо!

    Отработал именно этот скрипт:

    import-module activedirectory
    
    $dir = Get-ChildItem G:\profiles\*.v2 | Where {$_.PsIsContainer}
    $dir | Foreach {
    	$user = $_.Name.Replace(".V2","")
        $aduser=Get-ADUser $user
    	$acl = Get-Acl -Path ('G:\Profiles\'+$_.Name) 
    	$owner=[System.Security.Principal.NTAccount]$aduser.samaccountname
    	$acl.SetOwner($owner)
        $acl | Set-Acl $_.FullName
    }

    Может кому пригодится.


    Мой скромный Блог

    11 октября 2013 г. 5:39