Windows PowerShellを使用してアクセス許可を持つ共有を作成する


9

Powershellを使用して、共有を作成し、アクセス許可を設定する方法を教えてください。

たとえば次のように

  • 「パスc:\ shares \ foo」にマップする「public」という共有を作成します
  • DOMAIN1 \ Usersに共有への読み取り専用アクセスを許可します(これは、共有ではなく、ファイルにACLを設定することを意味しません)

回答:


7

これでうまくいくはずです:

net share "Public=c:\shares\foo" "/GRANT:Users,READ"

もちろん、これを行う場所/方法に応じて、管理者権限でPowerShellを起動する必要があります。


7

Win32_Share Createメソッドを使用します。例:

(Get-WmiObject -List -ComputerName . | Where-Object -FilterScript 
{$_.Name -eq "Win32_Share"}).InvokeMethod("Create",
   ("C:\FolderToShare","ShareName",0,100,"Share description"))

このメソッドのドキュメントは、MSDNにあります。

uint32 Create(
  [in]  string Path,
  [in]  string Name,
  [in]  uint32 Type,
  [in]  uint32 MaximumAllowed,
  [in]  string Description,
  [in]  string Password,
  [in]  Win32_SecurityDescriptor Access
);

パラメーター:

  • パス-Windows共有のローカルパス。たとえば、「C:\ FolderToShare」です。
  • 名前-Windowsシステムで共有としてセットアップされたパスにエイリアスを渡します。例、「ShareName」。
  • タイプ-共有されるリソースのタイプを渡します。タイプには、ディスクドライブ、印刷キュー、プロセス間通信(IPC)、および一般的なデバイスが含まれます。次のいずれかの値になります。
    • 0-ディスクドライブ
    • 1-印刷キュー
    • 2-デバイス
    • 3-IPC
    • 2147483648-ディスクドライブ管理者
    • 2147483649-印刷キュー管理者
    • 2147483650-デバイス管理者
    • 2147483651-IPC管理者
  • MaximumAllowed-このリソースを同時に使用できるユーザーの最大数の制限。例:100。このパラメーターはオプションです。
  • 説明-共有されるリソースを説明するオプションのコメント。このパラメーターはオプションです。例:「説明の共有」。
  • パスワード-共有リソースのパスワード(サーバーが共有レベルのセキュリティで実行されている場合)。サーバーがユーザーレベルのセキュリティで実行されている場合、このパラメーターは無視されます。このパラメーターはオプションです。
  • アクセス-ユーザーレベルのアクセス許可のセキュリティ記述子。セキュリティ記述子には、リソースのアクセス許可、所有者、およびアクセス機能に関する情報が含まれています。

アクセス許可を設定する方法の詳細については、MSDNのこのページを参照してください:Win32_SecurityDescriptor Class。この記事は、WMIタスク:ファイルとフォルダーも出発点として適しています。


2

以下の関数は一例であり、必要に応じて変更できます。主な制限は、共有をホストするマシンで実行する必要がある(または、PSリモーティングを使用して最初にそのマシンに到達する)ことです。スクリプトを実行するアカウントには、共有を作成するための十分な権限も必要です。

書かれているようDirectoryInfoに、それは引数としてオブジェクトを期待しますが、文字列に適合させることは難しくありません。この例には、それぞれ異なる種類のアクセス権を持つ2つの異なるオブジェクト(1つのユーザーと1つのグループ)のフォルダーに対するアクセス許可が含まれているため、複雑なアクセス許可要件を組み合わせて照合する方法を確認できます。

# $folder is a DirectoryInfo object
Function Create-FileShare($folder)
{
    $name = $folder.Name
    $path = $folder.FullName
    $description = "$name"
    $domain = "example.com" #AD Domain name here (Optional/Not really used/Here for completeness)

    $Method = "Create"
    $sd = ([WMIClass] "Win32_SecurityDescriptor").CreateInstance()

    #AccessMasks:
    #2032127 = Full Control
    #1245631 = Change
    #1179817 = Read

    #Share with the user
    $ACE = ([WMIClass] "Win32_ACE").CreateInstance()
    $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
    $Trustee.Name = $name
    $Trustee.Domain = $Null
    #original example assigned this, but I found it worked better if I left it empty
    #$Trustee.SID = ([wmi]"win32_userAccount.Domain='$domain',Name='$name'").sid    
    $ace.AccessMask = 1245631 
    $ace.AceFlags = 3 #Should almost always be three. Really. don't change it.
    $ace.AceType = 0 # 0 = allow, 1 = deny
    $ACE.Trustee = $Trustee 
    $sd.DACL += $ACE.psObject.baseobject 

    #Share with Domain Admins
    $ACE = ([WMIClass] "Win32_ACE").CreateInstance()
    $Trustee = ([WMIClass] "Win32_Trustee").CreateInstance()
    $Trustee.Name = "Domain Admins"
    $Trustee.Domain = $Null
    #$Trustee.SID = ([wmi]"win32_userAccount.Domain='$domain',Name='$name'").sid    
    $ace.AccessMask = 2032127
    $ace.AceFlags = 3
    $ace.AceType = 0
    $ACE.Trustee = $Trustee 
    $sd.DACL += $ACE.psObject.baseobject        

    $mc = [WmiClass]"Win32_Share"
    $InParams = $mc.psbase.GetMethodParameters($Method)
    $InParams.Access = $sd
    $InParams.Description = $description
    $InParams.MaximumAllowed = $Null
    $InParams.Name = $name
    $InParams.Password = $Null
    $InParams.Path = $path
    $InParams.Type = [uint32]0

    $R = $mc.PSBase.InvokeMethod($Method, $InParams, $Null)
    switch ($($R.ReturnValue))
     {
          0 {Write-Host "Share:$name Path:$path Result:Success"; break}
          2 {Write-Host "Share:$name Path:$path Result:Access Denied" -foregroundcolor red -backgroundcolor yellow;break}
          8 {Write-Host "Share:$name Path:$path Result:Unknown Failure" -foregroundcolor red -backgroundcolor yellow;break}
          9 {Write-Host "Share:$name Path:$path Result:Invalid Name" -foregroundcolor red -backgroundcolor yellow;break}
          10 {Write-Host "Share:$name Path:$path Result:Invalid Level" -foregroundcolor red -backgroundcolor yellow;break}
          21 {Write-Host "Share:$name Path:$path Result:Invalid Parameter" -foregroundcolor red -backgroundcolor yellow;break}
          22 {Write-Host "Share:$name Path:$path Result:Duplicate Share" -foregroundcolor red -backgroundcolor yellow;break}
          23 {Write-Host "Share:$name Path:$path Result:Reedirected Path" -foregroundcolor red -backgroundcolor yellow;break}
          24 {Write-Host "Share:$name Path:$path Result:Unknown Device or Directory" -foregroundcolor red -backgroundcolor yellow;break}
          25 {Write-Host "Share:$name Path:$path Result:Network Name Not Found" -foregroundcolor red -backgroundcolor yellow;break}
          default {Write-Host "Share:$name Path:$path Result:*** Unknown Error ***" -foregroundcolor red -backgroundcolor yellow;break}
     }
}

完全な開示:他の場所で見つかった投稿から次のコードを採用しました(残念ながら、私のPCがクラッシュしてリンクを失ったため、適切に属性を付けることができません)。このserverfaultの質問は検索で上位にランクされたことを覚えているので、ここに結果を含めたいと思いました。
Joel Coel

スクリプトをありがとうございますが、私はそれを遠くのフォルダで共有して共有できるようにしています。フォルダはNAS上にあり、PowerShellスクリプトを実行するためのUIはありません。離れたフォルダで機能させるための手がかりはありましたか?

@Badpandyこれを使用する場合、スクリプトを使用するにはホストマシンにrdpする必要があります。これは、2つのレベルのアクセス許可があるためです。共有のアクセス許可とローカルファイルシステムのアクセス許可は別々であり、アクセス許可の設定方法しかわかりませんローカルマシンで実行する場合は、ローカルファイルシステム上。
Joel Coel

0

Windows 7の場合、これを試してください。

net SHARE share=d:\share /GRANT:EVERYONE`,FULL /REMARK:"

上記はPowerShellでも動作します。注意前に、FULL

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.